Базовые представления¶
Следующие три класса реализуют достаточный набор функциональности, чтобы создать представление Django. Вы можете рассматривать их как родительские представления, которые можно использовать как непосредственно, так и в наследовании. Конечно, эти классы не всегда могут удовлетворить все требования к представлению в проекте: в таком случае рекомендуется «присмотреться» к примесям(Mixins) и общим представлениям классам(Generic class-based views)
Множество из встроенных CBV в Django наследуют другие представления-классы или классы-примеси. Это цепочка наследований(и порядок классов) очень важна, поэтому информация о классах-предках находится в разделе Ancestors (MRO). MRO - это акроним для Method Resolution Order.
View¶
- class django.views.generic.base.View¶
Базовый класс представления. Все остальные представления на основе классов наследуются от этого базового класса. Это не строго общее представление, поэтому его также можно импортировать из django.views.
Диаграмма методов
настройка()отправка()опции()
Пример 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)
Представление наследует методы и атрибуты из следующего представления:
Диаграмма методов
Пример 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)
Представление наследует методы и атрибуты из следующего представления:
Диаграмма методов
Пример 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 для редиректа.