Spec-Zone.ru › Django 5.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() отметит возвращаемую вызываемую функцию как корутину. Исключение ImproperlyConfigured будет поднято, если асинхронные (async def) и синхронные (def) обработчики определены в одном классе представления.

setup(request, *args, **kwargs)

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

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

dispatch(request, *args, **kwargs)

Часть представления, отвечающая за обработку запроса — метод, принимающий аргумент 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-шаблона для перенаправления. Обратный поиск будет выполнен с использованием тех же аргументов и ключевых слов, что и для данного вида.

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/5.0/ref/class-based-views/base/

Spec-Zone.ru

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