Django_-_podrobnoe_rukovodstvo
.pdf460 |
Приложение С. Справочник по обобщенным представлениям |
),
)
Обязательные аргументы
•• year: четырехзначный номер года, за который выводится архив (строка).
•• month: номер месяца, за который выводится архив, в формате, заданном в аргументе month_format.
•• queryset: объект QuerySet, содержащий архивные объекты.
•• date_field: имя поля типа DateField или DateTimeField в модели, связанной с объектом QuerySet, которое используется, чтобы определить, какие объекты показывать на странице.
Необязательные аргументы
•• month_format: строка, определяющая формат значения в аргументе month. Должна следовать соглашениям, принятым в модуле Python time.strftime. (Описание этого модуля имеется на странице http:// docs.python.org/library/time.html#time.strftime.) По умолчанию имеет значение “%b” – трехбуквенное сокращенное название месяца («янв», «фев», «мар» и т. д.). Чтобы выводился номер месяца, задайте значение “%m”.
•• allow_future: булевский флаг, показывающий, следует ли помещать на страницу объекты с датой в будущем (см. совет выше).
В представление могут быть переданы также следующие общие аргументы (см. табл. C.1):
•• allow_empty
•• context_processors
•• extra_context
•• mimetype
•• template_loader
•• template_name
•• template_object_name
Имя шаблона
В случае отсутствия аргумента template_name представление будет искать шаблон с именем <app_label>/<model_name>_archive_month.html.
Контекст шаблона
Помимо extra_context, в контекст шаблона добавляются следующие переменные:
•• month: объект datetime.date, описывающий требуемый месяц.
Обобщенные представления датированных объектов |
461 |
•• next_month: объект datetime.date, описывающий первый день следующего месяца. Если следующий месяц оказывается в будущем, то эта переменная будет иметь значение None.
•• previous_month: объект datetime.date, описывающий первый день предыдущего месяца. В отличие от next_month, эта переменная никогда не будет иметь значение None.
•• object_list: список всех объектов за указанный месяц. Имя переменной зависит от аргумента template_object_name, который по умолчанию равен ‘object’. Если аргумент template_object_name будет иметь значение ‘foo’, то переменная будет называться foo_list.
Архивы за неделю
Функция представления: django.views.generic.date_based.archive_week. Применяется для вывода страниц с архивами за указанную неделю.
Примечание
Для совместимости с соглашением о представлении дат, принятым в языке Python, Django считает, что первым днем недели является воскресенье.
Пример
urlpatterns = patterns(‘’,
# ...
(
r’^(?P<year>d{4})/(?P<week>d{2})/$’, date_based.archive_week,
book_info
),
)
Обязательные аргументы
•• year: четырехзначный номер года, за который выводится архив (строка).
•• week: номер недели в году, за которую выводится архив (строка).
•• queryset: объект QuerySet, содержащий архивные объекты.
•• date_field: имя поля типа DateField или DateTimeField в модели, связанной с объектом QuerySet, которое используется, чтобы определить, какие объекты показывать на странице.
Необязательные аргументы
•• allow_future: булевский флаг, показывающий, следует ли помещать на страницу объекты с датой в будущем (см. совет выше).
В представление могут быть переданы также следующие общие аргументы (см. табл. C.1):
462 |
Приложение С. Справочник по обобщенным представлениям |
•• allow_empty
•• context_processors
•• extra_context
•• mimetype
•• template_loader
•• template_name
•• template_object_name
Имя шаблона
В случае отсутствия аргумента template_name представление будет искать шаблон с именем <app_label>/<model_name>_archive_week.html.
Контекст шаблона
Помимо extra_context, в контекст шаблона добавляются следующие переменные:
•• week: объект datetime.date, описывающий первый день требуемой недели.
•• object_list: список всех объектов за указанную неделю. Имя переменной зависит от аргумента template_object_name, который по умолчанию равен ‘object’. Если аргумент template_object_name будет иметь значение ‘foo’, то переменная будет называться foo_list.
Архивы за день
Функция представления: django.views.generic.date_based.archive_day. Применяется для вывода страниц с архивами за указанный день.
Пример
urlpatterns = patterns(‘’,
# ...
(
r’^(?P<year>d{4})/(?P<month>[a-z]{3})/(?P<day>d{2})/$’, date_based.archive_day,
book_info
),
)
Обязательные аргументы
•• year: четырехзначный номер года, за который выводится архив (строка).
•• month: номер месяца, за который выводится архив, в формате, заданном в аргументе month_format.
Обобщенные представления датированных объектов |
463 |
•• day: номер дня, за который выводится архив, в формате, заданном в аргументе day_format.
•• queryset: объект QuerySet, содержащий архивные объекты.
•• date_field: имя поля типа DateField или DateTimeField в модели, связанной с объектом QuerySet, которое используется, чтобы определить, какие объекты показывать на странице.
Необязательные аргументы
•• month_format: строка, определяющая формат значения в аргументе month. Объяснение см. в разделе «Архивы за месяц» выше.
•• day_format: аналогичен month_format, но определяет формат дня. По умолчанию имеет значение “%d” (номер дня в месяце в виде десятичного числа от 01 до 31).
•• allow_future: булевский флаг, показывающий, следует ли помещать на страницу объекты с датой в будущем (см. совет выше).
В представление могут быть переданы также следующие общие аргументы (см. табл. C.1):
•• allow_empty
•• context_processors
•• extra_context
•• mimetype
•• template_loader
•• template_name
•• template_object_name
Имя шаблона
В случае отсутствия аргумента template_name представление будет искать шаблон с именем <app_label>/<model_name>_archive_day.html.
Контекст шаблона
Помимо extra_context, в контекст шаблона добавляются следующие переменные:
•• day: объект datetime.date, описывающий требуемый день.
•• next_day: объект datetime.date, описывающий следующий день. Если следующий день оказывается в будущем, то эта переменная будет иметь значение None.
•• previous_day: объект datetime.date, описывающий предыдущий день. В отличие от next_day, эта переменная никогда не будет иметь значение None.
464 |
Приложение С. Справочник по обобщенным представлениям |
•• object_list: список всех объектов за указанный день. Имя переменной зависит от аргумента template_object_name, который по умолчанию равен ‘object’. Если аргумент template_object_name будет иметь значение ‘foo’, то переменная будет называться foo_list.
Архив за сегодняшнюю дату
Представление django.views.generic.date_based.archive_today выводит все объекты за сегодня. Оно отличается от представления archive_day только тем, что аргументы year/month/day не задаются, вместо них берется текущая дата.
Пример
urlpatterns = patterns(‘’,
# ...
(r’^books/today/$’, date_based.archive_today, book_info),
)
Датированные страницы детализации
Функция представления: django.views.generic.date_based.object_detail. Применяется для вывода страницы с описанием отдельного объекта.
URL отличается от применяемого для представления object_detail. Представлению object_detail соответствуют URL вида /entries/<slug>/, тогда как этому представлению – URL вида /entries/2006/aug/27/<slug>/.
Примечание
Если вы пользуетесь датированными страницами детализации с ярлыками в составе URL, то, пожалуй, имеет смысл указать параметр unique_for_date для поля ярлыка, чтобы в один день не было одинаковых ярлыков. Подробнее о параметре unique_for_date см. приложение A.
Пример
Этот пример немного отличается от остальных примеров датированных представлений тем, что требуется указать либо идентификатор объекта, либо ярлык, чтобы Django мог найти интересующий нас объект.
Поскольку объекты, с которыми мы работаем, не имеют поля ярлыка, то будем пользоваться URL с идентификатором. Обычно подход на основе поля ярлыка считается более правильным, но для простоты оставим все как есть.
urlpatterns = patterns(‘’,
# ...
(
r’^(?P<year>d{4})/(?P<month>[a-z]{3})/(?P<day>d{2})/(?P<object_ id>[w-]+)/$’,
date_based.object_detail,
Обобщенные представления датированных объектов |
465 |
book_info
),
)
Обязательные аргументы
•• year: четырехзначный номер года (строка).
•• month: номер месяца в формате, заданном в аргументе month_format.
•• day: номер дня в формате, заданном в аргументе day_format.
•• queryset: объект QuerySet, содержащий требуемый объект.
•• date_field: имя поля типа DateField или DateTimeField в модели, связанной с объектом QuerySet, которое используется для поиска объекта с датой, заданной аргументами year, month и day.
Кроме того, необходимо указать один из двух аргументов:
•• object_id: значение первичного ключа для объекта или
•• slug: ярлык данного объекта. Если задан этот аргумент, то понадобится еще задать аргумент slug_field (см. следующий раздел).
Необязательные аргументы
•• allow_future: булевский флаг, показывающий, следует ли помещать на страницу объекты с датой в будущем (см. совет выше).
•• month_format: строка, определяющая формат значения в аргументе month. Объяснение см. в разделе «Архивы за месяц» выше.
•• day_format: аналогичен month_format, но определяет формат дня. По умолчанию имеет значение “%d” (номер дня в месяце в виде десятичного числа от 01 до 31).
•• slug_field: имя поля, содержащего ярлык объекта. Является обязательным, если используется аргумент slug, но должен отсутствовать при использовании аргумента object_id.
•• template_name_field: имя поля объекта, значением которого является имя шаблона. Это позволяет хранить имена шаблонов вместе с данными. Иными словами, если в объекте имеется поле ‘the_template’, содержащее строку ‘foo.html’, и аргумент template_name_field имеет значение ‘the_template’, то в обобщенном представлении для отображения этого объекта будет использоваться шаблон ‘foo.html’.
В представление могут быть переданы также следующие общие аргументы (см. табл. C.1):
•• context_processors
•• extra_context
•• mimetype
•• template_loader
466 |
Приложение С. Справочник по обобщенным представлениям |
•• template_name
•• template_object_name
Имя шаблона
В случае отсутствия аргумента template_name представление будет искать шаблон с именем <app_label>/<model_name>_detail.html.
Контекст шаблона
Помимо extra_context, в контекст шаблона добавляется следующая переменная:
•• object: сам объект. Имя этой переменной зависит от параметра template_object_name, который по умолчанию имеет значение ‘object’. Если бы этот параметр имел значение ‘foo’, то переменная называлась бы foo.
D
Параметры настройки
Файл параметров содержит все параметры настройки инсталляции Django. В этом приложении описывается, какие параметры имеются и как они используются.
Устройство файла параметров
Файл параметров – это обычный модуль Python с переменными уровня модуля. Вот несколько примеров:
DEBUG = False
DEFAULT_FROM_EMAIL = ‘webmaster@example.com’
TEMPLATE_DIRS = (‘/home/templates/mike’, ‘/home/templates/john’)
Раз файл параметров – модуль, к нему применимы следующие правила:
•• В нем должен содержаться корректный код на языке Python, синтаксические ошибки недопустимы.
•• Значения параметрам можно присваивать динамически, например:
MY_SETTING = [str(i) for i in range(30)]
•• Разрешается импортировать значения из других файлов параметров.
Значения по умолчанию
В файле параметров необязательно определять значения, которые вам не нужны. У любого параметра есть разумное значение по умолчанию. Значения по умолчанию определены в файле django/conf/global_settings.py.
При компиляции параметров Django поступает следующим образом:
1.Сначала загружает параметры из файла global_settings.py.
2.Затем загружает параметры из указанного файла, замещая одноимен ные глобальные параметры.
468 |
Приложение D. Параметры настройки |
Отметим, что файл параметров не должен импортировать файл global_ settings.py; это излишне.
Как узнать, какие параметры были изменены
Существует очень простой способ выяснить, значения каких парамет ров отличаются от значений по умолчанию. Команда manage.py diff settings выведет различия между значениями в файле параметров и значениями, принимаемыми Django по умолчанию.
Подробнее команда manage.py описана в приложении F.
Использование параметров в Python-коде
Чтобы в приложении Django получить доступ к параметрам настройки, достаточно импортировать объект django.conf.settings:
from django.conf import settings
if settings.DEBUG:
# Действия
Отметим, что django.conf.settings – не модуль, а объект. Поэтому импортировать только значения отдельных параметров невозможно:
from django.conf.settings import DEBUG # Не будет работать.
Еще отметим, что ваше приложение не должно выбирать, откуда импортировать параметры: из global_settings или из вашего собственного файла. django.conf.settings абстрагирует идею параметров по умолчанию и параметров конкретного сайта, предлагая единый интерфейс. Кроме того, фреймворк разрывает связь между программным кодом, который использует настройки, и местоположением файла, содержащего ваши настройки.
Изменение параметров во время выполнения
Не следует изменять параметры настройки во время работы приложения. Например, не включайте в представление такой код:
from django.conf import settings
settings.DEBUG = True # Не поступайте так!
Значения параметров должны определяться только в файле параметров и больше нигде.
Безопасность
Поскольку файл параметров содержит секретную информацию, в частности, пароль к базе данных, доступ к нему следует всячески ограничивать. Например, разрешить чтение только себе и веб-серверу. Особую важность это приобретает в условиях разделяемого хостинга.
Назначение файла параметров: DJANGO_SETTINGS_MODULE |
469 |
Создание собственных параметров
Ничто не мешает создавать собственные параметры для своих приложений Django. Нужно лишь придерживаться следующих соглашений:
•• Записывать имена параметров заглавными буквами.
•• Параметры, содержащие несколько значений, должны быть кортежами. Параметры следует считать неизменяемыми и не модифицировать их во время выполнения.
•• Не надо придумывать свой параметр, если подходящий уже сущест вует.
Назначение файла параметров: DJANGO_SETTINGS_MODULE
Фреймворку Django необходимо сообщить, какой файл параметров использовать. Для этого предназначена переменная окружения DJANGO_ SETTINGS_MODULE.
Ее значением должен быть путь в синтаксисе Python (например, mysite. settings). Отметим, что модуль параметров должен находиться в пути импорта (переменная PYTHONPATH).
Совет
Хорошее руководство по переменной PYTHONPATH есть на странице http:// diveintopython.org/getting_to_know_python/everything_is_an_object.html.
Утилита django-admin.py
При работе с утилитой django-admin.py (см. приложение F) можно либо однократно определить переменную окружения, либо явно указать мес тоположение файла параметров при запуске.
В командной оболочке UNIX Bash это выглядит так:
export DJANGO_SETTINGS_MODULE=mysite.settings django-admin.py runserver
А в Windows так:
set DJANGO_SETTINGS_MODULE=mysite.settings django-admin.py runserver
Вручную указать местоположение файла параметров позволяет параметр командной строки --settings:
django-admin.py runserver --settings=mysite.settings
