Spec-Zone.ru › Django 6.0

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

Следующие три класса предоставляют большую часть функциональности, необходимой для создания представлений Django. Их можно считать представлениями-родителями: их можно использовать самостоятельно или наследовать от них. Возможно, они не предоставляют всех возможностей, необходимых для проектов; в таком случае можно воспользоваться примесями и обобщёнными представлениями на основе классов.

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

View

class django.views.generic.base.View

Базовый класс представления. Все остальные представления на основе классов наследуются от этого базового класса. Строго говоря, это не обобщённое представление, поэтому его также можно импортировать из 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)

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

response = MyView.as_view()(request)

У возвращённого представления есть атрибуты view_class и view_initkwargs.

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

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

setup(request, *args, **kwargs)

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

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

При переопределении этого метода необходимо вызвать super().

dispatch(request, *args, **kwargs)

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

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

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

http_method_not_allowed(request, *args, **kwargs)

Если представление вызвано с HTTP-методом, который оно не поддерживает, вместо него вызывается этот метод.

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

options(request, *args, **kwargs)

Обрабатывает запросы с HTTP-методом OPTIONS. Возвращает ответ с заголовком Allow, содержащим список имён HTTP-методов, разрешённых для представления.

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

TemplateView

class django.views.generic.base.TemplateView

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

Предки (MRO)

Это представление наследует методы и атрибуты следующих представлений:

  • django.views.generic.base.TemplateResponseMixin
  • django.views.generic.base.ContextMixin
  • django.views.generic.base.View

Схема потока методов

  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"),
]

Контекст

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

RedirectView

class django.views.generic.base.RedirectView

Перенаправляет на заданный URL.

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

Если заданный URL равен None, Django вернёт HttpResponseGone (410).

Предки (MRO)

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

  • django.views.generic.base.View

Схема потока методов

  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, 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, чтобы вызвать HTTP-ошибку 410 (Gone).

pattern_name

Имя шаблона URL, на который нужно перенаправить. Обратное разрешение URL выполняется с использованием тех же args и kwargs, которые переданы этому представлению.

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 соответственно.

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

Если url не задан, get_redirect_url() пытается выполнить обратное разрешение pattern_name, используя данные, полученные из URL (используются как именованные, так и безымянные группы).

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

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/class-based-views/base/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API