Spec-Zone.ru › Django 1.8

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

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

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

Представление

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)
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. Возвращает список разрешенных HTTP-методов для представления.

Представление шаблона

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, который обслужил представление.

Представление перенаправления

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='http://djangoproject.com'), name='go-to-django'),
]

Атрибуты

url

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

pattern_name

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

permanent

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

Устарело начиная с версии 1.8: Значение по умолчанию атрибута permanent изменится с True на False в Django 1.9.

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

Spec-Zone.ru

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