Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Django_-_podrobnoe_rukovodstvo

.pdf
Скачиваний:
373
Добавлен:
01.03.2016
Размер:
5 Мб
Скачать
☆

450

 

Приложение С. Справочник по обобщенным представлениям

Таблица C.1. (Продолжение)

 

Аргумент

Описание

 

 

 

 

extra_context

Словарь значений, добавляемых в контекст шаблона­.

 

 

По умолчанию словарь пуст. Если какое-нибудь зна-

 

 

чение в словаре является вызываемым объектом, то

 

 

обобщенное представление вызовет его перед тем, как

 

 

приступать к отображению шаблона­.

 

mimetype

Тип MIME окончательного документа. По умолчанию

 

 

совпадает со значением параметра DEFAULT_MIME_TYPE,

 

 

равному text/html (если вы его не изменяли

 

 

в файле параметров).

 

queryset

Объект QuerySet (примером может служить результат

 

 

вызова Author.objects.all()), из которого извлекаются

 

 

объекты. Подробнее об объектах QuerySet см. приложе-

 

 

ние B. Этот аргумент является обязательным для боль-

 

 

шинства обобщенных представлений.

 

template_loader

Загрузчик шаблонов­. По умолчанию django.template.

 

 

loader. Подробнее о загрузчиках шаблонов­ см. главу 9.

 

template_name

Полное имя шаблона,­ предназначенного для отображе-

 

 

ния страницы. Позволяет переопределить имя шаблона,­

 

 

формируемое на основе QuerySet.

template_object_name Имя шаблонной­ переменной, помещаемой в контекст шаблона­. По умолчанию ‘object’. Если представление выводит несколько объектов (то есть речь идет о представлении object_list и различных представлениях, отображающих множество объектов для указанной даты), то к значению этого параметра будет добавлен суффикс ‘_list’.

Простые обобщенные представления

Модель django.views.generic.simple содержит простые представления для решения двух типичных задач: отображение шаблона­ без какой бы то ни было логики и переадресация.

Отображение шаблона­

Функция представления: django.views.generic.simple.direct_to_template.

Выполняет отображение шаблона,­ передавая ему в шаблонной­ переменной {{ params }} словарь параметров, взятых из URL.

Пример

Если конфигурация URL выглядит, как показано ниже, то запрос к URL /foo/ приведет к отображению шаблона­ foo_index.html, а запрос

Простые обобщенные представления

451

к URL /foo/15/ – к отображению того же шаблона­ с контекстной переменной {{ params.id }}, равной 15:

from django.conf.urls.defaults import *

from django.views.generic.simple import direct_to_template

urlpatterns = patterns(‘’,

(r’^foo/$’, direct_to_template, {‘template’: ‘foo_index.html’}), (r’^foo/(?P<id>\d+)/$’, direct_to_template,

{‘template’: ‘foo_detail.html’}),

)

Обязательные аргументы

•• template: полное имя шаблона­.

Переадресация на другой URL

Функция представления: django.views.generic.simple.redirect_to.

Переадресует клиента на другой URL. Переданный URL может содержать строковое представление словаря, значения из которого будут интерполированы в качестве параметров в URL.

Если вместо другого URL передано None, то Django вернет код 410 («Более не существует»).

Пример

Впоказанной ниже конфигурации URL определена переадресация

с/foo/<id>/ на /bar/<id>/:

from django.conf.urls.defaults import *

from django.views.generic.simple import redirect_to

urlpatterns = patterns(‘django.views.generic.simple’, (‘^foo/(?p<id>\d+)/$’, redirect_to, {‘url’: ‘/bar/%(id)s/’}),

)

Ав следующем примере при запросе к /bar/ возвращается код 410: from django.views.generic.simple import redirect_to

urlpatterns = patterns(‘django.views.generic.simple’, (‘^bar/$’, redirect_to, {‘url’: None}),

)

Обязательные аргументы

•• url: URL, на который производится переадресация, в виде строки. Или None, если необходимо вернуть HTTP-код 410 («Более не существует»).

452

Приложение С. Справочник по обобщенным представлениям

Обобщенные представления для списка/детализации

Обобщенные представления для списка/детализации (в модуле django. views.generic.list_detail) предназначены для типичного случая, когда требуется в одном представлении показать список элементов, а в другом – детальное описание одного элемента списка.

Список объектов

Функция представления: django.views.generic.list_detail.object_list. Применяется для вывода страницы со списком объектов.

Пример

Мы можем воспользоваться представлением object_list для вывода простого списка авторов (объекты Author, описанные в главе 5), включив в конфигурацию URL следующий фрагмент:

from mysite.books.models import Author from django.conf.urls.defaults import *

from django.views.generic import list_detail

author_list_info = {

‘queryset’: Author.objects.all(),

}

urlpatterns = patterns(‘’,

(r’authors/$’, list_detail.object_list, author_list_info)

)

Обязательные аргументы

•• queryset: объект QuerySet, содержащий набор объектов для отображения (см. табл. C.1).

Необязательные аргументы

•• paginate_by: целое число, равное количеству объектов на одной странице. Если задан, то представление разбивает набор на страницы по paginate_by элементов в каждой. Представление ожидает, что либо в строке GET-запроса присутствует параметр page, обозначающий номер страницы (нумерация начинается с единицы), либо в конфигурации URL задана переменная page. (См. ниже врезку «Замечание о разбиении на страницы»).

Дополнительно представление принимает следующие аргументы (описанные в табл. C.1).

•• allow_empty

•• context_processors

•• extra_context

Обобщенные представления для списка/детализации

453

•• mimetype

•• template_loader

•• template_name

•• template_object_name

Имя шаблона­

Вслучае отсутствия аргумента template_name представление будет искать шаблон­ с именем <app_label>/<model_name>_list.html. Метка приложения (app_label) и имя модели (model_name) формируются на основе параметра queryset. Метка приложения – это имя приложения, в котором определена модель, а имя модели совпадает с именем класса модели, записанным строчными буквами.

Впредыдущем примере, где в качестве аргумента queryset был передан набор Author.objects.all(), метка приложения равна books, а имя модели – author. Следовательно, шаблон­ по умолчанию будет называться

books/author_list.html.

Контекст шаблона­

Помимо extra_context, в контекст шаблона­ добавляются следующие переменные:

•• object_list: список объектов. Имя этой переменной зависит от параметра template_object_name, который по умолчанию имеет значение ‘object’. Если бы этот параметр имел значение ‘foo’, то переменная называлась бы foo_list.

•• is_paginated: булевское значение, показывающее, разбит ли список на страницы. Если общее количество объектов не превышает величины paginate_by, эта переменная будет иметь значение False.

Если список результатов разбит на страницы, то контекст будет содержать также следующие переменные:

•• results_per_page: количество объектов на одной странице (равно параметру paginate_by).

•• has_next: булевский флаг, показывающий, существует ли следующая страница.

•• has_previous: булевский флаг, показывающий, существует ли предыдущая страница.

•• page: номер текущей страницы, целое число. Нумерация начинается с 1.

•• next: номер следующей страницы, целое число. Даже если следующей страницы нет, эта переменная будет содержать ее гипотетический номер. Нумерация начинается с 1.

•• previous: номер предыдущей страницы, целое число. Нумерация начинается с 1.

454

Приложение С. Справочник по обобщенным представлениям

•• pages: общее количество страниц, целое число.

•• hits: общее количество объектов на всех страницах, а не только на текущей.

Замечание о разбиении на страницы

Если задан параметр paginate_by, то Django разбивает список на страницы.НомерстраницыможноуказатьвURLдвумяспособами:

•• Указать параметр page в образце URL, например, так:

(r’^objects/page(?P<page>[0-9]+)/$’, ‘object_list’, dict(info_dict))

•• Передать номер страницы в параметре строки запроса, например, с помощью URL такого вида:

/objects/?page=3

В обоих случаях нумерация начинается с 1, а не с нуля, поэтому номер первой страницы равен 1.

Детальное представление

Функция представления: django.views.generic.list_detail.object_detail.

Применяется для вывода страницы с детальным описанием одного объекта.

Пример

Продолжая предыдущий пример представления object_list, мы могли бы добавить детальное представление одного автора, изменив конфигурацию URL следующим образом:

from mysite.books.models import Author from django.conf.urls.defaults import *

from django.views.generic import list_detail

author_list_info = {

‘queryset’ : Author.objects.all(),

}

author_detail_info = {

“queryset” : Author.objects.all(), “template_object_name” : “author”,

}

urlpatterns = patterns(‘’,

(r’authors/$’, list_detail.object_list, author_list_info), (r’^authors/(?P<object_id>d+)/$’, list_detail.object_detail,

author_detail_info),

)

Обобщенные представления для списка/детализации

455

Обязательные аргументы

•• queryset: объект QuerySet, в котором выполняется поиск требуемого объекта (см. табл. C.1).

Кроме того, необходимо указать один из двух аргументов:

•• object_id: значение первичного ключа для объекта или

•• slug: ярлык данного объекта. Если используется этот аргумент, то понадобится еще определить аргумент slug_field (см. следующий раздел).

Необязательные аргументы

•• slug_field: имя поля, содержащего ярлык объекта. Обязателен, если используется аргумент slug, но должен отсутствовать при использовании аргумента object_id.

•• template_name_field: имя поля объекта, значением которого является имя шаблона­. Это позволяет хранить имена шаблонов­ вместе с данными.

Иными словами, если в объекте имеется поле ‘the_template’, содержащее строку ‘foo.html’, и аргумент template_name_field равен ‘the_ template’, то в обобщенном представлении для этого объекта будет использоваться шаблон­ ‘foo.html’.

Если шаблон­ с именем, указанным в аргументе template_name_field, не существует, то представление возьмет вместо него шаблон,­ заданный аргументом template_name. На первый взгляд, выглядит запутанно, но иногда бывает полезно.

В представление могут быть переданы также следующие общие аргументы (см. табл. C.1):

•• context_processors

•• extra_context

•• mimetype

•• template_loader

•• template_name

•• template_object_name

Имя шаблона­

Если ни один из аргументов template_name и template_name_field не задан, то представление будет искать шаблон­ с именем <app_label>/<model_ name>_detail.html.

456

Приложение С. Справочник по обобщенным представлениям

Контекст шаблона­

Помимо extra_context, в контекст шаблона­ добавляется следующая переменная:

•• object: сам объект. Имя этой переменной зависит от параметра template_object_name, который по умолчанию имеет значение ‘object’. Если бы этот параметр имел значение ‘foo’, то переменная называлась бы foo.

Обобщенные представления датированных объектов

Обычно такие представления применяются для вывода архивных страниц для датированных материалов. Вспомните о газетных архивах на указанную дату (день/месяц/год) или об архиве типичного блога.

Совет

По умолчанию эти представления игнорируют объекты с датами в будущем. Это означает, что при попытке зайти на страницу архива с датой в будущем Django автоматически вернет ошибку 404 («Страница не найдена»), даже если объекты, опубликованные в этот день, существуют. Таким образом, можно заранее публиковать объекты, которые будут недоступны до наступления указанной даты. Однако для некоторых типов датированных объектов такой подход не годится (например, календарь запланированных мероприятий). В этом случае можно передать параметр allow_future со значением True – и объекты с датой в будущем станут доступны (что даст пользователю возможность зайти на страницу «будущего» архива).

Указатель архивов

Функция представления: django.views.generic.date_based.archive_index.

Выводит указатель архивов верхнего уровня, в котором присутствуют «самые поздние» (недавно опубликованные) объекты, отсортированные по дате.

Пример

Предположим, что типичное издательство хочет организовать страницу с недавно опубликованными книгами. Если предположить, что имеется класс Book, содержащий поле publication_date, то для решения этой задачи можно воспользоваться представлением archive_index:

from mysite.books.models import Book from django.conf.urls.defaults import *

from django.views.generic import date_based

book_info = {

“queryset” : Book.objects.all(),

Обобщенные представления датированных объектов

457

“date_field” : “publication_date”

}

urlpatterns = patterns(‘’,

(r’^books/$’, date_based.archive_index, book_info),

)

Обязательные аргументы

•• date_field: имя поля типа DateField или DateTimeField в модели, связанной с объектом QuerySet, которое используется, чтобы определить, какие объекты показывать на странице.

•• queryset: набор QuerySet, содержащий архивные объекты.

Необязательные аргументы

•• allow_future: булевский флаг, показывающий, следует ли помещать на страницу объекты с датой в «будущем» (см. совет выше).

•• num_latest: количество «недавних» объектов, помещаемых в контекст шаблона­. По умолчанию равно 15.

В представление могут быть переданы также следующие общие аргументы (см. табл. C.1):

•• allow_empty

•• context_processors

•• extra_context

•• mimetype

•• template_loader

•• template_name

Имя шаблона­

В случае отсутствия аргумента template_name представление будет искать шаблон­ с именем <app_label>/<model_name>_archive.html.

Контекст шаблона­

Помимо extra_context, в контекст шаблона­ добавляются следующие переменные:

•• date_list: список объектов datetime.date, представляющий годы, для которых в наборе queryset есть объекты. Отсортирован в порядке убывания.

Например, если в блоге имеются записи с 2003 по 2006 год, то список будет содержать четыре объекта datetime.date, по одному для каждого года.

•• latest: num_latest объектов, отсортированных в порядке убывания значений поля date_field. Например, если значение num_latest рав-

458

Приложение С. Справочник по обобщенным представлениям

но 10, то список latest будет содержать 10 объектов из набора queryset с наибольшими датами.

Архивы за год

Функция представления: django.views.generic.date_based.archive_year.

Применяется для вывода страниц с архивами за год. На таких страницах размещается список месяцев, для которых существует хотя бы один объект, и дополнительно могут отображаться все объекты, опубликованные в данном году.

Пример

Продолжая предыдущий пример, добавим представление для вывода списка всех опубликованных в данном году книг:

from mysite.books.models import Book from django.conf.urls.defaults import *

from django.views.generic import date_based

book_info = {

“queryset” : Book.objects.all(), “date_field” : “publication_date”

}

urlpatterns = patterns(‘’,

(r’^books/$’, date_based.archive_index, book_info), (r’^books/(?P<year>d{4})/?$’, date_based.archive_year, book_info),

)

Обязательные аргументы

•• date_field: то же, что для представления archive_index (см. предыдущий раздел).

•• queryset: объект QuerySet, содержащий архивные объекты.

•• year: четырехзначный номер года, за который выводится архив (обычно берется из URL, как в примере конфигурации выше).

Необязательные аргументы

•• make_object_list: булевский флаг, показывающий, нужно ли выбирать из базы и передавать в шаблон­ полный список объектов за данный год. Если имеет значение True, то список объектов будет доступен в шаблоне­ в виде переменной object_list (вместо имени object_ list может быть задано другое; см. следующий далее раздел «Контекст шаблона»)­ . По умолчанию имеет значение False.

•• allow_future: булевский флаг, показывающий, следует ли помещать на страницу объекты с датой в будущем (см. совет выше).

В представление могут быть переданы также следующие общие аргументы (см. табл. C.1):

Обобщенные представления датированных объектов

459

•• allow_empty

•• context_processors

•• extra_context

•• mimetype

•• template_loader

•• template_name

•• template_object_name

Имя шаблона­

В случае отсутствия аргумента template_name представление будет искать шаблон­ с именем <app_label>/<model_name>_archive_year.html.

Контекст шаблона­

Помимо extra_context, в контекст шаблона­ добавляются следующие переменные:

•• date_list: список объектов datetime.date, представляющий месяцы, для которых в наборе queryset имеется хотя бы один объект. Отсортирован в порядке возрастания.

•• year: год в виде строки из четырех цифр.

•• object_list: если аргумент make_object_list имеет значение True, то в этой переменной передается список всех объектов за указанный год, отсортированный по дате. Имя переменной зависит от аргумента template_object_name, который по умолчанию имеет значение ‘object’. Если в аргументе template_object_name передать значение ‘foo’, то переменная будет называться foo_list. Если аргумент make_object_list будет иметь значение False, то в переменной object_list будет передан пустой список.

Архивы за месяц

Функция представления: django.views.generic.date_based.archive_month. Применяется для вывода страниц с архивами за указанный месяц.

Пример

Продолжая предыдущий пример, добавим представление для вывода архивов за месяц:

urlpatterns = patterns(‘’,

(r’^books/$’, date_based.archive_index, book_info), (r’^books/(?P<year>d{4})/?$’, date_based.archive_year, book_info),

(

r’^(?P<year>d{4})/(?P<month>[a-z]{3})/$’, date_based.archive_month,

book_info