• 3.1
  • 3.2
  • 5.0
  • Версия документации: 6.1

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

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

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

View

class django.views.generic.base.View

Базовый класс представления. Все остальные представления на основе классов наследуются от этого базового класса. Это не строго общее представление, поэтому его также можно импортировать из django.views.

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

  1. настройка()

  2. отправка()

  3. http_method_not_allowed()

  4. опции()

Пример 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.

Когда представление вызывается в цикле запрос/ответ, HttpRequest добавляется в атрибут request представления. Любые позиционные и/или именованные аргументы, полученные из URL, добавляются в атрибуты args и ``kwargs``соответственно. Затем вызывается метод dispatch().

Если подкласс View определяет асинхронные (async def) обработчики методов, as_view() пометит возвращаемый вызываемый объект как функцию сопрограммы. Исключение ImproperlyConfigured будет возбуждено, если в одном классе представления определены как асинхронные (async def), так и синхронные (def) обработчики.

setup(request, *args, **kwargs)

Выполняет инициализацию ключевого представления перед dispatch().

Назначает HttpRequest атрибуту request представления, а любые позиционные и/или ключевые аргументы, полученные из шаблона URL, атрибутам args и kwargs соответственно.

Если вы переопределяете этот метод, вы должны вызвать super().

dispatch(request, *args, **kwargs)

Часть представления view — метод, который принимает аргумент request плюс аргументы и возвращает HTTP-ответ.

Реализация по умолчанию анализирует 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.

Если другие обработчики HTTP-методов в классе являются асинхронными («async def»), тогда ответ будет заключен в сопрограммную функцию для использования с «await».

TemplateView

class django.views.generic.base.TemplateView

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

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

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

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

  1. as_view()

  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. as_view()

  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, ArticleDetailView

urlpatterns = [
    path(
        "counter/<int:pk>/",
        ArticleCounterRedirectView.as_view(),
        name="article-counter",
    ),
    path("details/<int:pk>/", ArticleDetailView.as_view(), name="article-detail"),
    path(
        "go-to-django/",
        RedirectView.as_view(url="https://www.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 для редиректа

Аргументы args и kwargs являются позиционными и/или ключевыми аргументами, полученными из шаблона URL <how-django-processes-a-request> соответственно.

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

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

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

Back to Top