Базовые представления
Следующие три класса предоставляют большую часть функциональности, необходимой для создания представлений 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.Когда представление вызывается во время цикла запрос/ответ,
HttpRequestприсваивается атрибуту представленияrequest. Любые позиционные и/или ключевые аргументы полученные из шаблона URL присваиваются атрибутамargsиkwargsсоответственно. Затем вызываетсяdispatch().
-
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-методов представления.
-
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).Предки (Порядок разрешения методов)
Это представление наследует методы и атрибуты от следующего представления:
Диаграмма потока методов
Пример 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, ArticleDetail urlpatterns = [ path('counter/<int:pk>/', ArticleCounterRedirectView.as_view(), name='article-counter'), path('details/<int:pk>/', ArticleDetail.as_view(), name='article-detail'), path('go-to-django/', RedirectView.as_view(url='https://djangoproject.com'), name='go-to-django'), ]Атрибуты
-
url -
URL для перенаправления в виде строки. Или
Noneдля поднятия ошибки 410 (Gone) HTTP.
-
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 для перенаправления.
Реализация по умолчанию использует
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/2.1/ref/class-based-views/base/