404 Глава 18 • Знакомство с Django
Страницы отдельных тем
Следующим шагом станет создание страницы для вывода информации по одной
теме, с названием темы и всеми записями по этой теме. Мы снова определим новую
схему URL, напишем представление и создадим шаблон. Кроме того, на страни-
це со списком тем каждый элемент маркированного списка будет преобразован
в ссылку на соответствующую страницу отдельной темы.
Схема URL для отдельных тем
Схема 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
используется для получения нужной темы внутри
функции.
Представление отдельной темы
Функция
topic()
должна получить тему и все связанные с ней записи из базы
данных:
views.py
--snip--
def topic(request, topic_id):
"""Выводит одну тему и все ее записи."""
topic = Topic.objects.get(id=topic_id)
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
Построение
других страниц 405
Это первая функция представления, которой требуется параметр, отличный
от объекта запроса. Функция получает значение, совпавшее с выражени-
ем
(?P
\d+)
, и сохраняет его в
topic_id
. В точке функция
get()
используется для получения темы (по аналогии с тем, как мы это делали в оболочке
Django). В точке загружаются записи, связанные с данной темой, и они упоря-
дочиваются по значению
date_added
: знак «минус» перед
date_added
сортирует
результаты в обратном порядке, то есть самые последние записи будут находиться
на первых местах. Тема и записи сохраняются в словаре
context
, который пере-
дается шаблону
topic .html
.
Достарыңызбен бөлісу: