Книга «Изучаем Python»


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



Pdf көрінісі
бет222/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   218   219   220   221   222   223   224   225   ...   238
Рис. 18.4. Страница со списком тем


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

 .



Достарыңызбен бөлісу:
1   ...   218   219   220   221   222   223   224   225   ...   238




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет