Menu
CoddyTech

Le menu complet

Fait partie de la section Les bases de Django du Journey Django de Coddy. Leçon 21 sur 23.

Le menu complet du café se trouve dans MENU dans menu/views.py : un dictionnaire de sections, chacune étant une liste d’articles. Pour parcourir ensemble les clés et les valeurs d’un dictionnaire, appelez sa méthode items. Un modèle appelle une méthode sans parenthèses, et une boucle peut décomposer deux valeurs, comme le for key, value in d.items() de Python. Une semaine de plats du jour :

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

Chaque valeur est une liste, qui peut donc être parcourue à son tour : un {% for %} à l’intérieur d’un {% for %}, chacun étant fermé par son propre {% endfor %}.

challenge icon

Défi

Moyen

Ajoute la page du menu complet.

  1. Dans menu/views.py, écris une vue qui affiche menu/menu.html avec MENU comme menu.
  2. Dans menu/urls.py, ajoute la route menu/ nommée menu.
  3. Dans menu.html, parcours les sections : un <section class="menu-section"> pour chacune, avec son nom dans un <h2>. À l’intérieur, parcours ses éléments : un <li class="menu-item"> pour chacun, avec le nom, puis <span class="price">$4.00</span>.

Ouvre /menu/ : la page affiche Coffee, Tea et Cakes, et le Carrot Cake coûte $4.00.

Essayez vous-même

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

Toutes les leçons de Les bases de Django

Entraînez-vous par vous-même : Playground Django