Базовые представления

Следующие три класса реализуют достаточный набор функциональности, чтобы создать представление Django. Вы можете рассматривать их как родительские представления, которые можно использовать как непосредственно, так и в наследовании. Конечно, эти классы не всегда могут удовлетворить все требования к представлению в проекте: в таком случае рекомендуется “присмотреться” к примесям(Mixins) и общим представлениям классам(Generic class-based views)

Множество из встроенных CBV в Django наследуют другие представления-классы или классы-примеси. Это цепочка наследований(и порядок классов) очень важна, поэтому информация о классах-предках находится в разделе Ancestors (MRO). MRO - это акроним для Method Resolution Order.

View

class django.views.generic.base.View

Самый главный класс в CBV. Все остальные представления-классы наследуются от него.

Диаграмма методов

  1. dispatch()
  2. http_method_not_allowed()
  3. options()

Пример views.py:

from django.http import HttpResponse
from django.views.generic import View

class MyView(View):

    def get(self, request, *args, **kwargs):
        return HttpResponse('Hello, World!')

Пример urls.py:

from django.conf.urls import patterns, url

from myapp.views import MyView

urlpatterns = patterns('',
    url(r'^mine/$', MyView.as_view(), name='my-view'),
)

Атрибуты

http_method_names

Список методов HTTP, которые принимает(обрабатывает) данное представление.

Значения по умолчанию:

['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

Методы

classmethod as_view(**initkwargs)

Возвращает выполняемое(callable) представление, которое принимает запрос(request) и возвращает ответ(response):

response = MyView.as_view()(request)
dispatch(request, *args, **kwargs)

view часть представления – метод, который принимает аргумент request плюс дополнительные аргументы, и возвращает HTTP ответ(response).

Реализация по умолчанию анализирует HTTP метод запроса и делегирует его соответствующему методу класса; GET будет обработан методом get(), запрос POST делегируется к post(), и т.д.

По умолчанию, запрос HEAD будет делегирован в метод get(). Если вам необходимо обработать HEAD запрос другим способом, вы можете переопределить метод head(). Смотри Поддержка других методов HTTP для примера.

http_method_not_allowed(request, *args, **kwargs)

Если представление было вызвано с неподдерживаемым методом HTTP, будет вызван данный метод.

Реализация по умолчанию возвращает HttpResponseNotAllowed со списком разрешенных методов в виде простого текста.

options(request, *args, **kwargs)

Обрабатывает запросы на определение “глаголов”(методов) OPTIONS HTTP. Возвращает список всех разрешенных для представления методов HTTP.

TemplateView

class django.views.generic.base.TemplateView

Обрабатывает заданный шаблон, используя контекст(context), содержащий параметры из URL.

Changed in Django 1.5:

The context used to be populated with a {{ params }} dictionary of the parameters captured in the URL. Now those parameters are first-level context variables.

Классы-предки, Ancestors (MRO)

Представление наследует методы и атрибуты из следующего представления:

Диаграмма методов

  1. dispatch()
  2. http_method_not_allowed()
  3. get_context_data()

Пример views.py:

from django.views.generic.base import TemplateView

from articles.models import Article

class HomePageView(TemplateView):

    template_name = "home.html"

    def get_context_data(self, **kwargs):
        context = super(HomePageView, self).get_context_data(**kwargs)
        context['latest_articles'] = Article.objects.all()[:5]
        return context

Пример urls.py:

from django.conf.urls import patterns, url

from myapp.views import HomePageView

urlpatterns = patterns('',
    url(r'^$', HomePageView.as_view(), name='home'),
)

Контекст(Context)

  • params: словарей ключевых аргументов, “отловленных” из шаблона URL, который обрабатывается данным представлением.

RedirectView

class django.views.generic.base.RedirectView

Редирект на заданный URL.

Переданный URL может содержать строку с форматированием (dictionary-style), которая будет обработана в соответствии с параметрами “отловленными” в URL. Поскольку ключевая интерполяция всегда выполняется (даже если не было передано никаких аргументов), любые символы "%" в URL должны быть написаны как "%%", а затем Python преобразует их в один знак процента на выходе.

Если переданный URL равен None, Django вернет исключение HttpResponseGone (410).

Классы-предки, Ancestors (MRO)

Представление наследует методы и атрибуты из следующего представления:

Диаграмма методов

  1. dispatch()
  2. http_method_not_allowed()
  3. get_redirect_url()

Пример views.py:

from django.shortcuts import get_object_or_404
from django.views.generic.base import RedirectView

from articles.models import Article

class ArticleCounterRedirectView(RedirectView):

    permanent = False
    query_string = True
    pattern_name = 'article-detail'

    def get_redirect_url(self, *args, **kwargs):
        article = get_object_or_404(Article, pk=pk)
        article.update_counter()
        return super(ArticleCounterRedirectView, self).get_redirect_url(*args, **kwargs)

Пример urls.py:

from django.conf.urls import patterns, url
from django.views.generic.base import RedirectView

from article.views import ArticleCounterRedirectView, ArticleDetail

urlpatterns = patterns('',

    url(r'^counter/(?P<pk>\d+)/$', ArticleCounterRedirectView.as_view(), name='article-counter'),
    url(r'^details/(?P<pk>\d+)/$', ArticleDetail.as_view(), name='article-detail'),
    url(r'^go-to-django/$', RedirectView.as_view(url='http://djangoproject.com'), name='go-to-django'),
)

Атрибуты

url

Адрес URL для редиректа, в виде строки. Или None для генерации 410 (Gone) HTTP ошибки.

pattern_name
New in Django 1.6.

Название URL-шаблона на который перенаправлять. Вычисление URL-а будет выполнено с аргументами, переданными в это предсталение.

permanent

Должно ли перенаправление должно быть постоянным. Единственная разница состоит в возвращаемом HTTP коде статуса. Если True, то для редиректа используется код статуса(use status) 301. Если False, то 302. По умолчанию, permanent установлен в True.

query_string

Передавать ли строку GET запроса в новую локацию. Если True,то строка запроса добавляется к URL. Если False, то строка запроса обрасывается. По умолчанию, query_string равно False.

Методы

get_redirect_url(**kwargs)

Создает целевой URL для редиректа

Реализация по умолчанию использует url в качестве отправной строки, выполняет подстановку % параметров в этой строке, а также добавляет строку запроса если указано в атрибуте query_string. Подклассы могут реализовать любое поведение, важно лишь чтобы метод возвращал корректную строку URL для редиректа.