Menu
CoddyTech

完整菜单

本课属于 Coddy Django 学习旅程的“Django 基础”单元。第 21 课,共 23 课。

咖啡馆的完整菜单位于 MENU 中,具体在 menu/views.py:它是一个由各个单元组成的字典,每个单元都是一个项目列表。若要同时遍历字典的键和值,可以调用它的 items 方法。模板调用方法时不加括号,循环可以像 Python 的 for key, value in d.items() 一样解包两个值。一周的每日特餐:

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

每个值都是一个列表,因此也可以依次遍历它:在一个 {% for %} 中嵌套另一个 {% for %},并分别用各自的 {% endfor %} 结束。

challenge icon

挑战

中等

添加完整的菜单页面。

  1. 在 menu/views.py 中,编写一个视图,用 MENU 作为 menu 渲染 menu/menu.html。
  2. 在 menu/urls.py 中,添加名为 menu 的路由 menu/。
  3. 在 menu.html 中,循环遍历各个单元:每个单元对应一个 <section class="menu-section">,并将单元名称放在 <h2> 中。在其中循环遍历各个项目:每个项目对应一个 <li class="menu-item">,显示项目名称,然后添加 <span class="price">$4.00</span>。

打开 /menu/:页面会列出 Coffee、Tea 和 Cakes,Carrot Cake 的价格是 $4.00。

亲手试试

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

Django 基础中的所有课

自己练习: Django 在线编辑器