Базовые виды¶
Следующие три класса обеспечивают большую часть функциональности, необходимой для создания представлений Django. Вы можете рассматривать их как родительские представления, которые могут использоваться сами по себе или наследоваться от них. Они могут не предоставлять всех возможностей, необходимых для проектов, в этом случае существуют Миксины и представления на основе классов Generic.
Многие встроенные в Django представления, основанные на классах, наследуются от других представлений, основанных на классах, или различных миксинов. Поскольку эта цепочка наследования очень важна, классы-предки документируются в разделе Предки (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)¶ Возвращает вызываемое представление, которое принимает запрос и возвращает ответ:
response = MyView.as_view()(request)
Возвращаемое представление имеет атрибуты
view_class
иview_initkwargs
.Когда представление вызывается во время цикла запрос/ответ, метод
setup()
присваиваетHttpRequest
атрибуту представленияrequest
, а любые позиционные и/или ключевые аргументы captured from the URL pattern атрибутамargs
иkwargs
соответственно. Затем вызываетсяdispatch()
.Если подкласс
View
определяет асинхронные (async def
) обработчики методов,as_view()
пометит возвращаемый вызываемый метод как функцию coroutine. Если для одного класса представления определены асинхронные (ImproperlyConfigured
) и синхронные (async def
) обработчики, будет вызвано исключениеdef
.
-
setup
(request, *args, **kwargs)¶ Выполняет инициализацию представления ключа перед
dispatch()
.Если вы переопределяете этот метод, вы должны вызвать
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
** Блок-схема метода**
Пример 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)
Это представление наследует методы и атрибуты от следующего представления:
** Блок-схема метода**
Пример 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 (Ушел) HTTP.
-
pattern_name
¶ Имя шаблона 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
являются позиционными и/или ключевыми аргументами captured from the URL pattern, соответственно.Реализация по умолчанию использует
url
в качестве начальной строки и выполняет расширение именованных параметров%
в этой строке, используя именованные группы, захваченные в URL.Если
url
не установлено,get_redirect_url()
пытается обратитьpattern_name
, используя то, что было захвачено в URL (используются как именованные, так и неименованные группы).При запросе
query_string
он также добавит строку запроса к сгенерированному URL. Подклассы могут реализовать любое поведение по своему усмотрению, лишь бы метод возвращал готовую к перенаправлению строку URL.
-