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 artículos. Para recorrer las claves y los valores de un diccionario a la vez, llama a su método items. En una plantilla, se llama a un método sin paréntesis, y un bucle puede desempaquetar dos valores, como el for key, value in d.items() de Python. Una semana de ofertas diarias:

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

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

challenge icon

Desafío

Intermedio

Añade la página del menú completo.

  1. En menu/views.py, escribe una vista que renderice menu/menu.html con MENU como menu.
  2. En menu/urls.py, añade la ruta menu/ con el nombre menu.
  3. En menu.html, recorre las secciones: una <section class="menu-section"> para cada una, con su nombre en un <h2>. Dentro, recorre sus elementos: un <li class="menu-item"> para cada uno, con el nombre, después <span class="price">$4.00</span>.

Abre /menu/: muestra Coffee, Tea y Cakes, y el Carrot Cake cuesta $4.00.

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