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.
Aufgabe
MittelFüge die vollständige Menüseite hinzu.
- Schreibe in
menu/views.pyeine Ansicht, diemenu/menu.htmlmitMENUalsmenurendert. - Füge in
menu/urls.pydie Routemenu/mit dem Namenmenuhinzu. - Durchlaufe in
menu.htmldie 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
1Deine erste Django-Website
Hallo, DjangoEine zweite Seite4Layouts und statische Dateien
Template-VererbungEin Titel für jede SeiteÜbe selbstständig: Django-Playground