Следующие три класса реализуют достаточный набор функциональности, чтобы создать представление Django. Вы можете рассматривать их как родительские представления, которые можно использовать как непосредственно, так и в наследовании. Конечно, эти классы не всегда могут удовлетворить все требования к представлению в проекте: в таком случае рекомендуется “присмотреться” к примесям(Mixins) и общим представлениям классам(Generic class-based views)
Множество из встроенных CBV в Django наследуют другие представления-классы или классы-примеси. Это цепочка наследований(и порядок классов) очень важна, поэтому информация о классах-предках находится в разделе Ancestors (MRO). MRO - это акроним для Method Resolution Order.
Самый главный класс в CBV. Все остальные представления-классы наследуются от него.
Диаграмма методов
Пример views.py:
from django.http import HttpResponse
from django.views.generic import View
class MyView(View):
def get(self, request, *args, **kwargs):
return HttpResponse('Hello, World!')
Пример urls.py:
from django.conf.urls import url
from myapp.views import MyView
urlpatterns = [
url(r'^mine/$', MyView.as_view(), name='my-view'),
]
Атрибуты
Список методов HTTP, которые принимает(обрабатывает) данное представление.
Значения по умолчанию:
['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
Методы
Возвращает выполняемое(callable) представление, которое принимает запрос и возвращает ответ:
response = MyView.as_view()(request)
Возвращаемое представление содержит атрибуты view_class и view_initkwargs.
view часть представления – метод, который принимает аргумент request плюс дополнительные аргументы, и возвращает HTTP ответ(response).
Реализация по умолчанию анализирует HTTP метод запроса и делегирует его соответствующему методу класса; GET будет обработан методом get(), запрос POST делегируется к post(), и т.д.
По умолчанию, запрос HEAD будет делегирован в метод get(). Если вам необходимо обработать HEAD запрос другим способом, вы можете переопределить метод head(). Смотри Поддержка других методов HTTP для примера.
Если представление было вызвано с неподдерживаемым методом HTTP, будет вызван данный метод.
Реализация по умолчанию возвращает HttpResponseNotAllowed со списком разрешенных методов в виде простого текста.
Обрабатывает запросы на определение “глаголов”(методов) OPTIONS HTTP. Возвращает список всех разрешенных для представления методов HTTP.
Обрабатывает заданный шаблон, используя контекст(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(HomePageView, self).get_context_data(**kwargs)
context['latest_articles'] = Article.objects.all()[:5]
return context
Пример urls.py:
from django.conf.urls import url
from myapp.views import HomePageView
urlpatterns = [
url(r'^$', HomePageView.as_view(), name='home'),
]
Контекст(Context)
Словарь ключевых аргументов, “отловленных” (через ContextMixin) из шаблона URL, который обрабатывается данным представлением.
Редирект на заданный 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(ArticleCounterRedirectView, self).get_redirect_url(*args, **kwargs)
Пример urls.py:
from django.conf.urls import url
from django.views.generic.base import RedirectView
from article.views import ArticleCounterRedirectView, ArticleDetail
urlpatterns = [
url(r'^counter/(?P<pk>[0-9]+)/$', ArticleCounterRedirectView.as_view(), name='article-counter'),
url(r'^details/(?P<pk>[0-9]+)/$', ArticleDetail.as_view(), name='article-detail'),
url(r'^go-to-django/$', RedirectView.as_view(url='https://djangoproject.com'), name='go-to-django'),
]
Атрибуты
Адрес URL для редиректа, в виде строки. Или None для генерации 410 (Gone) HTTP ошибки.
Название URL-шаблона на который перенаправлять. Вычисление URL-а будет выполнено с аргументами, переданными в это представление.
Должно ли перенаправление быть постоянным. Единственная разница состоит в возвращаемом HTTP коде статуса. Если True, то для редиректа используется код статуса 301. Если False, то 302. По умолчанию, permanent установлен в False.
Значение по умолчанию для атрибута permanent изменено с True на False.
Передавать ли строку GET запроса в новую локацию. Если True,то строка запроса добавляется к URL. Если False, то строка запроса отбрасывается. По умолчанию, query_string равно False.
Методы
Создает целевой URL для редиректа
Реализация по умолчанию использует url в качестве отправной строки, выполняет подстановку % параметров в этой строке из именованных параметров, полученных из URL.
Если url не указан, get_redirect_url() пытается получить URL по pattern_name, используя “отловленные” параметры из URL (именованные и позиционные).
Если указан атрибут query_string, GET параметры будут добавлены к сгенерированному URL. Подклассы могут реализовать любое поведение, важно лишь чтобы метод возвращал корректную строку URL для редиректа.
Mar 31, 2016