В цикле каждая тема должна быть преобразована в элемент маркированного списка. Чтобы вывести значение переменной в шаблоне, заключите ее имя в двойные фигурные скобки. Код {{ topic }} в точке (3) будет заменен значением topic при каждом проходе цикла. Фигурные скобки на странице не появятся; они всего лишь сообщают Django об использовании шаблонной переменной. Тег HTML

  • обозначает элемент списка. Все, что находится между тегами, в паре тегов
      , будет отображаться как элемент маркированного списка.

      В точке (4) находится шаблонный тег {% empty %}, который сообщает Django, что делать при отсутствии элементов в списке. В нашем примере выводится сообщение о том, что темы еще не созданы. Последние две строки завершают цикл for (5) и маркированный список ?.

      Затем необходимо изменить базовый шаблон и включить ссылку на страницу с темами:

      base.html

      (1) Learning Log -

      (2) Topics

      {% block content %}{% endblock content %}

      После ссылки на домашнюю страницу (1) добавляется дефис, после которого вставляется ссылка на страницу тем, которая также представлена шаблонным тегом (2). Эта строка приказывает Django сгенерировать ссылку, соответствующую схеме URL с именем 'topics', в learning_logs/urls.py.

      Обновив домашнюю страницу в браузере, вы увидите ссылку Topics. Щелчок на этой ссылке открывает страницу, похожую на рис. 18.4.

      Рис. 18.4. Страница со списком тем

      <p>Страницы отдельных тем</p>

      Следующим шагом станет создание страницы для вывода информации по одной теме, с названием темы и всеми записями по этой теме. Мы снова определим новую схему URL, напишем представление и создадим шаблон. Кроме того, на странице со списком тем каждый элемент маркированного списка будет преобразован в ­ссылку на соответствующую страницу отдельной темы.

      <p>Схема URL для отдельных тем</p>

      Схема URL для страницы отдельной темы немного отличается от других схем URL, которые встречались нам ранее, потому что в ней используется атрибут id темы для обозначения запрашиваемой темы. Например, если пользователь хочет просмотреть страницу с подробной информацией по теме Chess (id=1), эта страница будет иметь URL-адрес http://localhost:8000/topics/1/. Вот как выглядит схема для этого URL-адреса из learning_logs/urls.py:

      urls.py

      ...

      urlpatterns = [

      ...

      . .# Страница с подробной информацией по отдельной теме

      . .url(r'^topics/(?P\d+)/$', views.topic, name='topic'),

      ]

      Рассмотрим регулярное выражение в схеме URL, r'^topics/(?P\d+)/$'. Символ r сообщает Django, что последующая строка должна интерпретироваться без дополнительной обработки, а выражение заключено в кавычки. Вторая часть выражения, /(?P\d+)/, описывает целое число, заключенное между двумя косыми чертами; это целое число сохраняется в аргументе topic_id. Круглые скобки, в которые заключена эта часть выражения, сохраняют значение из URL; часть ?P сохраняет совпавшее значение в topic_id; а выражение \d+ ­совпадает с любым количеством цифр, заключенных между символами косой черты.

      Когда Django находит URL-адрес, соответствующий этой схеме, вызывается функция представления topic(), в аргументе которой передается значение, хранящееся в topic_id. Значение topic_id используется для получения нужной темы внутри функции.

      <p>Представление отдельной темы</p>

      Функция topic() должна получить тему и все связанные с ней записи из базы данных:

      views.py

      --snip--

      (1) def topic(request, topic_id):

      . ."""Выводит одну тему и все ее записи."""

      (2) . .topic = Topic.objects.get(id=topic_id)

      (3) . .entries = topic.entry_set.order_by('-date_added')

      (4) . .context = {'topic': topic, 'entries': entries}

      (5) . .return render(request, 'learning_logs/topic.html', context)

      Перейти на страницу:

      Все книги серии Библиотека программиста

      Похожие книги