Menu
CoddyTech

模板片段

本课属于 Coddy Django 学习旅程的“JSON API”单元。第 14 课,共 19 课。

脚本并不总是需要 JSON。添加任务后,它可能会向服务器请求该任务现成的 <li>,并将它放入列表中。模板已经会绘制这一行,因此服务器应该复用它。

Django 6.0 添加了模板局部片段:模板中一段有名称的内容,你也可以单独渲染它。用 {% partialdef name %} 和 {% endpartialdef %} 将它括起来;加上 inline 这个词后,它也会在原位置绘制,在循环中每个项目绘制一次。视图可以只渲染模板中由模板名称、# 和局部片段名称指定的部分:

{% partialdef cart-total inline %}
    <strong>{{ cart.total }}</strong>
{% endpartialdef %}
return render(request, "shop/cart.html#cart-total", {"cart": cart})

上下文必须包含这段内容读取的数据,这里是 cart。页面和局部片段共用同一份标记,因此它们不会彼此脱节。

challenge icon

挑战

中等

单独显示新 /tasks/ 页面中的一行。

  1. 在 tasks/list.html 中,将循环里的 <li> 设为名为 task-row 的 inline partial,这样 /tasks/ 仍会显示所有行。
  2. 在 tasks/views.py 中,添加 task_row(request, pk):只渲染这个 partial,并传入 task;找不到时显示 Django 的 404 页面。
  3. 在 tasks/urls.py 中,添加名为 task_row 的 "tasks/<int:pk>/row/" 路由。

打开 /tasks/3/row/:只显示 Call the bank (done),不显示标题。

亲手试试

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>All tasks</title>
</head>
<body>
    <h1>All tasks</h1>
    <ul id="tasks">
        {% for task in tasks %}
            <li id="task-{{ task.id }}">{{ task.title }}{% if task.done %} (done){% endif %}</li>
        {% endfor %}
    </ul>
</body>
</html>
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

JSON API中的所有课

自己练习: Django 在线编辑器