Базовые представления¶
Следующие три класса реализуют достаточный набор функциональности, чтобы создать представление Django. Вы можете рассматривать их как родительские представления, которые можно использовать как непосредственно, так и в наследовании. Конечно, эти классы не всегда могут удовлетворить все требования к представлению в проекте: в таком случае рекомендуется «присмотреться» к примесям(Mixins) и общим представлениям классам(Generic class-based views)
Множество из встроенных CBV в Django наследуют другие представления-классы или классы-примеси. Это цепочка наследований(и порядок классов) очень важна, поэтому информация о классах-предках находится в разделе Ancestors (MRO). MRO - это акроним для Method Resolution Order.
View¶
- class django.views.generic.base.View¶
The master class-based base view. All other class-based views inherit from this base class. It isn’t strictly a generic view and thus can also be imported from
django.views.Диаграмма методов
dispatch()
Пример 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().
- setup(request, *args, **kwargs)¶
Выполняет инициализацию ключевого представления перед
dispatch().Если вы переопределяете этот метод, вы должны вызвать
super().
- dispatch(request, *args, **kwargs)¶
The
viewpart of the view – the method that accepts arequestargument plus arguments, and returns a HTTP response.Реализация по умолчанию анализирует HTTP метод запроса и делегирует его соответствующему методу класса;
GETбудет обработан методомget(), запросPOSTделегируется кpost(), и т.д.По умолчанию, запрос
HEADбудет делегирован в методget(). Если вам необходимо обработатьHEADзапрос другим способом, вы можете переопределить методhead(). Смотри Поддержка других методов HTTP для примера.
- http_method_not_allowed(request, *args, **kwargs)¶
If the view was called with a HTTP method it doesn’t support, this method is called instead.
Реализация по умолчанию возвращает
HttpResponseNotAllowedсо списком разрешенных методов в виде простого текста.
- options(request, *args, **kwargs)¶
Обрабатывает запросы OPTIONS HTTP. Возвращает список всех разрешенных для представления методов HTTP в заголовке
Allow.
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 для редиректа.