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

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

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

View

class django.views.generic.base.View

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

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

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

Пример views.py:

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

class MyView(View):

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

Пример urls.py:

from django.urls import path

from myapp.views import MyView

urlpatterns = [
    path('mine/', MyView.as_view(), name='my-view'),
]

Атрибуты

http_method_names

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

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

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

Методы

classmethod as_view(**initkwargs)

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

response = MyView.as_view()(request)

Возвращаемое представление содержит атрибуты view_class и view_initkwargs.

When the view is called during the request/response cycle, the setup() method assigns the HttpRequest to the view’s request attribute, and any positional and/or keyword arguments captured from the URL pattern to the args and kwargs attributes, respectively. Then dispatch() is called.

setup(request, *args, **kwargs)
New in Django 2.2.

Initializes view instance attributes: self.request, self.args, and self.kwargs prior to dispatch().

Overriding this method allows mixins to setup instance attributes for reuse in child classes. When overriding this method, you must call super().

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 в заголовке Allow.

TemplateView

class django.views.generic.base.TemplateView

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

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

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

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

  1. setup()
  2. dispatch()
  3. http_method_not_allowed()
  4. 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().get_context_data(**kwargs)
        context['latest_articles'] = Article.objects.all()[:5]
        return context

Пример urls.py:

from django.urls import path

from myapp.views import HomePageView

urlpatterns = [
    path('', HomePageView.as_view(), name='home'),
]

Контекст(Context)

  • Словарь ключевых аргументов, «отловленных» (через ContextMixin) из шаблона URL, который обрабатывается данным представлением.
  • Вы можете добавить контекст, используя аргумент extra_context для метода as_view().

RedirectView

class django.views.generic.base.RedirectView

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

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

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

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

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

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

  1. setup()
  2. dispatch()
  3. http_method_not_allowed()
  4. 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=kwargs['pk'])
        article.update_counter()
        return super().get_redirect_url(*args, **kwargs)

Пример urls.py:

from django.urls import path
from django.views.generic.base import RedirectView

from article.views import ArticleCounterRedirectView, ArticleDetail

urlpatterns = [
    path('counter/<int:pk>/', ArticleCounterRedirectView.as_view(), name='article-counter'),
    path('details/<int:pk>/', ArticleDetail.as_view(), name='article-detail'),
    path('go-to-django/', RedirectView.as_view(url='https://djangoproject.com'), name='go-to-django'),
]

Атрибуты

url

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

pattern_name

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

permanent

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

query_string

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

Методы

get_redirect_url(*args, **kwargs)

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

Реализация по умолчанию использует url в качестве отправной строки, выполняет подстановку % параметров в этой строке из именованных параметров, полученных из URL.

Если url не указан, get_redirect_url() пытается получить URL по pattern_name, используя «отловленные» параметры из URL (именованные и позиционные).

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