Spec-Zone.ru › Django 1.9

Базовые представления

Следующие три класса предоставляют большую часть функциональности, необходимой для создания представлений Django. Можно рассматривать их как родительские представления, которые могут использоваться сами по себе или наследоваться от них. Они могут не предоставлять всех возможностей, необходимых для проектов, в этом случае используются миксины и обобщённые представления на основе классов.

Многие встроенные представления Django на основе классов наследуют от других представлений на основе классов или различных миксинов. Поскольку эта цепочка наследования очень важна, родительские классы документированы в разделе Предки (MRO). MRO — это аббревиатура от Method Resolution Order.

View

class django.views.generic.base.View

Базовое представление на основе класса. Все другие представления на основе класса наследуются от этого базового класса.

Диаграмма потока методов

  1. dispatch()
  2. http_method_not_allowed()
  3. options()

Пример 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_method_names

Список имён HTTP-методов, которые будет принимать это представление.

Значение по умолчанию:

['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

Методы

classmethod as_view(**initkwargs)

Возвращает вызываемое представление, которое принимает запрос и возвращает ответ:

response = MyView.as_view()(request)

Возвращаемое представление имеет атрибуты view_class и view_initkwargs.

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.

Предки (MRO)

Это представление наследует методы и атрибуты от следующих представлений:

  • django.views.generic.base.TemplateResponseMixin
  • django.views.generic.base.ContextMixin
  • django.views.generic.base.View

Диаграмма потока методов

  1. dispatch()
  2. http_method_not_allowed()
  3. get_context_data()

Пример 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'),
]

Контекст

  • Заполняется (через ContextMixin) ключевыми аргументами, извлечёнными из URL-шаблона, который обслужил представление.

RedirectView

class django.views.generic.base.RedirectView

Перенаправляет на заданный URL.

Заданный URL может содержать форматирование строк в стиле словаря, которое будет интерполировано относительно параметров, извлечённых из URL. Поскольку интерполяция ключевых слов всегда выполняется (даже если аргументы не передаются), все символы "%" в URL должны быть написаны как "%%", чтобы Python конвертировал их в один символ процента на выходе.

Если заданный URL равен None, Django вернёт HttpResponseGone (410).

Предки (MRO)

Это представление наследует методы и атрибуты от следующего представления:

  • django.views.generic.base.View

Диаграмма потока методов

  1. dispatch()
  2. http_method_not_allowed()
  3. get_redirect_url()

Пример 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

URL для перенаправления в виде строки. Или None для повышения HTTP-ошибки 410 (Gone).

pattern_name

Имя URL-шаблона для перенаправления. Обратный поиск будет выполнен с теми же аргументами и ключевыми словами, что и для этого представления.

permanent

Является ли перенаправление постоянным. Единственное отличие здесь — это возвращаемый HTTP-код состояния. Если True, то перенаправление будет использовать код состояния 301. Если False, то перенаправление будет использовать код состояния 302. По умолчанию permanent равно False.

Значение по умолчанию атрибута permanent изменено с True на 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/1.9/ref/class-based-views/base/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API