Базовые представления
Следующие три класса обеспечивают большую часть функциональности, необходимой для создания представлений Django. Можно рассматривать их как родительские представления, которые могут использоваться самостоятельно или наследоваться от них. Возможно, они не предоставляют все возможности, необходимые для проектов, в этом случае можно использовать миксины и обобщённые представления на основе классов.
Многие встроенные представления 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, а любые позиционные и/или ключевые аргументы, полученные из шаблона URL, соответственно атрибутамargsиkwargs. Затем вызываетсяdispatch().Если подкласс
Viewопределяет обработчики асинхронных (async def) методов,as_view()пометит возвращаемую вызываемую функцию как корутину. ИсключениеImproperlyConfiguredбудет возбуждено, если асинхронные (async def) и синхронные (def) обработчики определены в одном классе представления.Изменено в Django 4.1:Добавлена совместимость с асинхронными (
async def) обработчиками методов.
-
setup(request, *args, **kwargs) -
Выполняет ключевую инициализацию представления перед
dispatch().При переопределении этого метода необходимо вызвать
super().
-
dispatch(request, *args, **kwargs) -
Часть представления, отвечающая за обработку запроса — метод, который принимает аргумент
requestи аргументы, а возвращает 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.Изменено в Django 4.1:Добавлена совместимость с классами, определяющими асинхронные (
async def) обработчики методов.
-
TemplateView
-
class django.views.generic.base.TemplateView -
Отображает заданный шаблон, при этом контекст содержит параметры, полученные из URL.
Предки (MRO)
Это представление наследует методы и атрибуты от следующих представлений:
django.views.generic.base.TemplateResponseMixindjango.views.generic.base.ContextMixindjango.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для вызова 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/4.1/ref/class-based-views/base/