Частичные шаблоны
Часть раздела JSON API путешествия по Django на Coddy. Урок 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>в цикле встроенным partial-шаблоном с именемtask-row, чтобы/tasks/по-прежнему отображала все строки. - В
tasks/views.pyдобавьtask_row(request, pk): отобрази только этот partial-шаблон, передав емуtask, или страницу 404 Django. - В
tasks/urls.pyдобавь маршрут"tasks/<int:pk>/row/"с именемtask_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