ПРИМЕЧАНИЕ
В больших проектах часто создается один родительский шаблон base .html для всего сайта и ро-
дительские шаблоны для каждого крупного раздела сайта . Все шаблоны разделов наследуют
от base .html, и каждая страница сайта наследует от шаблона раздела . При такой структуре вы смо-
Построение других страниц 401
жете легко изменять оформление и поведение сайта в целом, любого его раздела или отдельной
страницы . Данная конфигурация сильно повышает эффективность работы и стимулирует разработ-
чика к дальнейшему совершенствованию сайта .
Страница со списком тем
Разобравшись с тем, как эффективно организовать построение страниц, мы можем
сосредоточиться на следующих двух страницах: списке всех тем и списке записей
по одной теме. На странице тем выводится перечень всех тем, созданных пользо-
вателями, и это первая страница, на которой нам придется работать с данными.
Схема URL для тем
Сначала нужно определить URL для страницы тем. Обычно в таких случаях
выбирается простой фрагмент URL, который отражает суть информации, пред-
ставленной на странице. Мы воспользуемся словом topics, так что для получения
страницы будет использоваться URL http://localhost:8000/topics/. А вот какие из-
менения следует внести в
learning_logs/urls .py
:
urls.py
"""Определяет схемы URL для learning_logs."""
...
urlpatterns = [
# Домашняя страница
url(r'^$', views.index, name='index'),
# Вывод всех тем.
url(r'^topics/$', views.topics, name='topics'),
]
Мы просто добавили
topics/
в аргумент регулярного выражения, используемый
с URL-адресом домашней страницы . Когда Django проверяет запрашиваемый
URL-адрес, эта схема совпадет с любым URL-адресом, который состоит из базо-
вого URL-адреса и слова
topics
. Косую черту в конце можно включить, можно
не включать, но после слова
topics
ничего быть не должно, иначе схема не совпа-
дет. Любой запрос с URL-адресом, соответствующим этой схеме, будет передан
функции
topics()
в
views .py
.
Представление topics
Функция
topics()
должна получать данные из базы данных и отправлять их ша-
блону. Обновленная версия
views .py
выглядит так:
views.py
from django.shortcuts import render
from .models import Topic
def index(request):
...
402 Глава 18 • Знакомство с Django
def topics(request):
"""Выводит список тем."""
topics = Topic.objects.order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
Сначала импортируется модель, связанная с нужными данными . Функции
topics()
необходим один параметр: объект запроса, полученный Django от сер-
вера . В точке выдается запрос к базе данных на получение объектов
Topic
,
отсортированных по атрибуту
date_added
. Полученный итоговый набор сохраня-
ется в
topics
.
В точке определяется контекст, который будет передаваться шаблону. Контекст
представляет собой словарь, в котором ключами являются имена, используемые
в шаблоне для обращения к данным, а значениями — данные, которые должны пере-
даваться шаблону. В данном случае существует всего одна пара «ключ—значение»,
которая содержит набор тем, отображаемых на странице. При построении стра-
ницы, использующей данные, функции
render()
передается переменная
context
,
а также объект
request
и путь к шаблону .
Шаблон topics
Шаблон страницы со списком тем получает словарь
context
, чтобы шаблон мог ис-
пользовать данные, предоставленные
topics()
. Создайте файл с именем
topics .html
в одном каталоге с
index .html
. Вывод списка тем в шаблоне осуществляется следу-
ющим образом:
topics.html
{% extends "learning_logs/base.html" %}
{% block content %}
Topics
{% endblock content %}
Сначала тег
{%
extends
%}
объявляет о наследовании от
base .html
, как и в случае
с шаблоном
index
, после чего открывается блок
content
. Тело страницы содержит
маркированный (bulleted) список введенных тем. В стандартном языке HTML мар-
кированный список называется неупорядоченным списком и обозначается тегами
. Список тем начинается в точке .
В точке находится другой шаблонный тег, эквивалентный циклу
for
для пере-
бора списка тем из словаря
context
. Код, используемый в шаблоне, отличает-
ся от Python в нескольких важных отношениях. Python использует отступы
Построение других страниц 403
для обозначения строк, входящих в тело цикла. В шаблоне каждый цикл
for
должен
снабжаться явным тегом
{%
endfor
%}
, обозначающим конец цикла. Таким образом,
в шаблонах часто встречаются циклы следующего вида:
{% for элемент in список %}
действия для каждого элемента
{% endfor %}
В цикле каждая тема должна быть преобразована в элемент маркированного спи-
ска. Чтобы вывести значение переменной в шаблоне, заключите ее имя в двойные
фигурные скобки. Код
{{
topic
}}
в точке будет заменен значением
topic
при
каждом проходе цикла. Фигурные скобки на странице не появятся; они всего
лишь сообщают Django об использовании шаблонной переменной. Тег HTML
обозначает элемент списка. Все, что находится между тегами, в паре тегов
, будет отображаться как элемент маркированного списка.
В точке находится шаблонный тег
{%
empty
%}
, который сообщает Django, что
делать при отсутствии элементов в списке. В нашем примере выводится сообще-
ние о том, что темы еще не созданы. Последние две строки завершают цикл
for
и маркированный список
.
Затем необходимо изменить базовый шаблон и включить ссылку на страницу
с темами:
base.html
Learning Log -
Topics
{% block content %}{% endblock content %}
После ссылки на домашнюю страницу добавляется дефис, после которого встав-
ляется ссылка на страницу тем, которая также представлена шаблонным тегом .
Эта строка приказывает Django сгенерировать ссылку, соответствующую схеме
URL с именем
'topics'
, в
learning_logs/urls .py
.
Обновив домашнюю страницу в браузере, вы увидите ссылку
Topics
. Щелчок
на этой ссылке открывает страницу, похожую на рис. 18.4.
Достарыңызбен бөлісу: |