Следующие три класса реализуют достаточный набор функциональности, чтобы создать представление 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 patterns, url
from myapp.views import MyView
urlpatterns = patterns('',
url(r'^mine/$', MyView.as_view(), name='my-view'),
)
Атрибуты
Список методов HTTP, которые принимает(обрабатывает) данное представление.
Значения по умолчанию:
['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
Методы
Возвращает выполняемое(callable) представление, которое принимает запрос(request) и возвращает ответ(response):
response = MyView.as_view()(request)
view часть представления - метод, который принимает аргумент request плюс дополнительные аргументы, и возвращает HTTP ответ(response).
Реализация по умолчанию анализирует HTTP метод запроса и делегирует его соответствующему методу класса; GET будет обработан методом get(), запрос POST делегируется к post(), и т.д.
По умолчанию, запрос HEAD будет делегирован в метод get(). Если вам необходимо обработать HEAD запрос другим способом, вы можете переопределить метод head(). Смотри Поддержка других методов HTTP для примера.
Если представление было вызвано с неподдерживаемым методом HTTP, будет вызван данный метод.
Реализация по умолчанию возвращает HttpResponseNotAllowed со списком разрешенных методов в виде простого текста.
Обрабатывает запросы на определение “глаголов”(методов) OPTIONS HTTP. Возвращает список всех разрешенных для представления методов HTTP.
Обрабатывает заданный шаблон, используя контекст(context), содержащий параметры из URL.
The context used to be populated with a {{ params }} dictionary of the parameters captured in the URL. Now those parameters are first-level context variables.
Классы-предки, 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 patterns, url
from myapp.views import HomePageView
urlpatterns = patterns('',
url(r'^$', HomePageView.as_view(), name='home'),
)
Контекст(Context)
params: словарей ключевых аргументов, “отловленных” из шаблона 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=pk)
article.update_counter()
return super(ArticleCounterRedirectView, self).get_redirect_url(*args, **kwargs)
Пример urls.py:
from django.conf.urls import patterns, url
from django.views.generic.base import RedirectView
from article.views import ArticleCounterRedirectView, ArticleDetail
urlpatterns = patterns('',
url(r'^counter/(?P<pk>\d+)/$', ArticleCounterRedirectView.as_view(), name='article-counter'),
url(r'^details/(?P<pk>\d+)/$', ArticleDetail.as_view(), name='article-detail'),
url(r'^go-to-django/$', RedirectView.as_view(url='http://djangoproject.com'), name='go-to-django'),
)
Атрибуты
Адрес URL для редиректа, в виде строки. Или None для генерации 410 (Gone) HTTP ошибки.
Название URL-шаблона на который перенаправлять. Вычисление URL-а будет выполнено с аргументами, переданными в это предсталение.
Должно ли перенаправление должно быть постоянным. Единственная разница состоит в возвращаемом HTTP коде статуса. Если True, то для редиректа используется код статуса(use status) 301. Если False, то 302. По умолчанию, permanent установлен в True.
Передавать ли строку GET запроса в новую локацию. Если True,то строка запроса добавляется к URL. Если False, то строка запроса обрасывается. По умолчанию, query_string равно False.
Методы
Создает целевой URL для редиректа
Реализация по умолчанию использует url в качестве отправной строки, выполняет подстановку % параметров в этой строке, а также добавляет строку запроса если указано в атрибуте query_string. Подклассы могут реализовать любое поведение, важно лишь чтобы метод возвращал корректную строку URL для редиректа.
Mar 30, 2016