模板片段
本课属于 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。页面和局部片段共用同一份标记,因此它们不会彼此脱节。
挑战
中等单独显示新 /tasks/ 页面中的一行。
- 在
tasks/list.html中,将循环里的<li>设为名为task-row的inlinepartial,这样/tasks/仍会显示所有行。 - 在
tasks/views.py中,添加task_row(request, pk):只渲染这个 partial,并传入task;找不到时显示 Django 的 404 页面。 - 在
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>
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
JSON API中的所有课
自己练习: Django 在线编辑器