Menu
CoddyTech

Il menu completo

Fa parte della sezione Fondamenti di Django del percorso Django di Coddy. Lezione 21 di 23.

Il menu completo del caffè si trova in MENU in menu/views.py: un dizionario di sezioni, ciascuna composta da un elenco di voci. Per iterare contemporaneamente sulle chiavi e sui valori di un dizionario, chiama il suo metodo items. Un template chiama un metodo senza parentesi e un ciclo può spacchettare due valori, come for key, value in d.items() di Python. Una settimana di specialità del giorno:

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

Ogni valore è un elenco, quindi è possibile iterarvi a sua volta: un {% for %} dentro un {% for %}, ciascuno chiuso dal proprio {% endfor %}.

challenge icon

Sfida

Medio

Aggiungi la pagina del menu completo.

  1. In menu/views.py, scrivi una vista che esegue il rendering di menu/menu.html con MENU come menu.
  2. In menu/urls.py, aggiungi la route menu/ chiamata menu.
  3. In menu.html, esegui un ciclo sulle sezioni: una <section class="menu-section"> per ciascuna, con il suo nome in un <h2>. Al suo interno, esegui un ciclo sui suoi elementi: un <li class="menu-item"> per ciascuno, con il nome seguito da <span class="price">$4.00</span>.

Apri /menu/: elenca Coffee, Tea e Cakes e la Carrot Cake costa $4.00.

Provalo tu

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.")

Tutte le lezioni di Fondamenti di Django

Esercitati da solo: Playground Django