Menu
CoddyTech

El menú completo

Parte de la sección Conceptos básicos de Django del Journey de Django de Coddy. Lección 21 de 23.

El menú completo de la cafetería está en MENU, en menu/views.py: un diccionario de secciones, cada una con una lista de elementos. Para recorrer juntas las claves y los valores de un diccionario, llama a su método items. Una plantilla llama a un método sin paréntesis, y un bucle puede desempaquetar dos valores, como en for key, value in d.items() de Python. Una semana de especiales diarios:

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

Cada valor es una lista, así que se puede recorrer a su vez: un {% for %} dentro de otro {% for %}, cada uno cerrado con su propio {% endfor %}.

challenge icon

Desafío

Intermedio
menu/menu.html ya está creado. Añade la página del menú en /menu/:
  • una vista que la renderice con MENU y una ruta llamada menu;
  • una <section class="menu-section"> por sección, con su nombre en un <h2>;
  • un <li class="menu-item"> por elemento: su nombre y, después, <span class="price">$4.00</span>.

Presiona Run: la vista previa abrirá /menu/.

Pruébalo tú mismo

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

Todas las lecciones de Conceptos básicos de Django

Practica por tu cuenta: Playground de Django