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