Menu
CoddyTech

Die vollständige Speisekarte

Teil des Abschnitts Django-Grundlagen der Django-Journey von Coddy. Lektion 21 von 23.

Die vollständige Speisekarte des Cafés steht in MENU in menu/views.py: ein Wörterbuch aus Abschnitten, von denen jeder eine Liste mit Gerichten enthält. Um gemeinsam über die Schlüssel und Werte eines Wörterbuchs zu iterieren, rufst du seine Methode items auf. In einer Vorlage wird eine Methode ohne Klammern aufgerufen, und eine Schleife kann zwei Werte entpacken, wie bei Pythons for key, value in d.items(). Eine Woche mit Tagesangeboten:

{% for day, specials in week.items %}
    <h3>{{ day }}</h3>
    <p>{{ specials|join:", " }}</p>
{% endfor %}

Jeder Wert ist eine Liste, über die sich wiederum iterieren lässt: ein {% for %} innerhalb eines {% for %}, wobei jede Schleife mit ihrem eigenen {% endfor %} geschlossen wird.

challenge icon

Aufgabe

Mittel

Füge die vollständige Menüseite hinzu.

  1. Schreibe in menu/views.py eine Ansicht, die menu/menu.html mit MENU als menu rendert.
  2. Füge in menu/urls.py die Route menu/ mit dem Namen menu hinzu.
  3. Durchlaufe in menu.html die Abschnitte: für jeden Abschnitt ein <section class="menu-section">, dessen Name in einem <h2>. Durchlaufe darin die Einträge: für jeden Eintrag ein <li class="menu-item">, der Name, dann <span class="price">$4.00</span>.

Öffne /menu/: Dort werden Coffee, Tea und Cakes aufgelistet, und der Carrot Cake kostet $4.00.

Probier es selbst

from django.http import Http404, HttpResponse
from django.shortcuts import render

DRINKS = {
    "espresso": {
        "slug": "espresso",
        "name": "Espresso",
        "price": 2.5,
        "description": "A short, strong shot of coffee.",
        "sold_out": False,
    },
    "latte": {
        "slug": "latte",
        "name": "Latte",
        "price": 3.5,
        "description": "Espresso with lots of steamed milk.",
        "sold_out": False,
    },
    "flat-white": {
        "slug": "flat-white",
        "name": "Flat White",
        "price": 3.75,
        "description": "Espresso with a thin layer of silky milk.",
        "sold_out": False,
    },
    "hot-chocolate": {
        "slug": "hot-chocolate",
        "name": "Hot Chocolate",
        "price": 3,
        "description": "Dark chocolate melted into warm milk.",
        "sold_out": True,
    },
}


MENU = {
    "Coffee": [
        {"name": "Espresso", "price": 2.5},
        {"name": "Latte", "price": 3.5},
        {"name": "Flat White", "price": 3.75},
    ],
    "Tea": [
        {"name": "Green Tea", "price": 2.5},
        {"name": "Chai", "price": 3.25},
    ],
    "Cakes": [
        {"name": "Carrot Cake", "price": 4},
        {"name": "Lemon Tart", "price": 3.5},
    ],
}


def home(request):
    return render(request, "menu/home.html", {"special": DRINKS["flat-white"]})


def drink_list(request):
    return render(request, "menu/drinks.html", {"drinks": DRINKS.values()})


def about(request):
    return HttpResponse("Corner Café opened in 2026.")


def hours(request):
    return HttpResponse("Open every day from 8:00 to 18:00.")


def contact(request):
    return HttpResponse("Write to us at hello@cornercafe.example.")


def table(request, number):
    return HttpResponse(f"<h1>Table {number}</h1>")


def drink(request, slug):
    if slug not in DRINKS:
        raise Http404(f"No drink called {slug}")
    item = DRINKS[slug]
    return HttpResponse(f"<h1>{item['name']}</h1><p>{item['description']}</p>")


def order(request):
    size = request.GET.get("size", "medium")
    if size not in ["small", "medium", "large"]:
        size = "medium"
    return HttpResponse(f"You ordered a {size} coffee.")

Alle Lektionen in Django-Grundlagen

Übe selbstständig: Django-Playground