Spec-Zone.ru › Django 1.11

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

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

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

View

class django.views.generic.base.View

Основной базовый класс представления на основе класса. Все остальные представления на основе класса наследуются от этого базового класса. Это не строго обобщенное представление, и поэтому его также можно импортировать из django.views.

Изменено в Django 1.10:

Добавлена возможность импортировать из django.views.

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

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

Пример 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.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 атрибуты.

При вызове представления во время цикла запрос/ответ 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.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).

Предки (порядок разрешения методов)

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

  • 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.

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.11/ref/class-based-views/base/

Spec-Zone.ru

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