Spec-Zone.ru › Django 2.2

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

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

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

View

class django.views.generic.base.View

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

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

  1. setup()
  2. dispatch()
  3. http_method_not_allowed()
  4. 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.urls import path

from myapp.views import MyView

urlpatterns = [
    path('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.

Когда представление вызывается во время цикла запрос/ответ, метод setup() присваивает HttpRequest атрибуту представления request, а все позиционные и/или ключевые аргументы извлеченные из шаблона URL – атрибутам args и kwargs соответственно. Затем вызывается dispatch().

setup(request, *args, **kwargs)
Новая функция в Django 2.2.

Инициализирует атрибуты экземпляра представления: self.request, self.args, и self.kwargs перед вызовом dispatch().

Переопределение этого метода позволяет миксинам настроить атрибуты экземпляра для повторного использования в дочерних классах. При переопределении этого метода необходимо вызвать super().

dispatch(request, *args, **kwargs)

Часть представления, которая обрабатывает view аргумент плюс дополнительные аргументы и возвращает 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. setup()
  2. dispatch()
  3. http_method_not_allowed()
  4. 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().get_context_data(**kwargs)
        context['latest_articles'] = Article.objects.all()[:5]
        return context

Пример urls.py:

from django.urls import path

from myapp.views import HomePageView

urlpatterns = [
    path('', HomePageView.as_view(), name='home'),
]

Контекст

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

RedirectView

class django.views.generic.base.RedirectView

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

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

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

Предки (MRO)

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

  • django.views.generic.base.View

Схема потока метода

  1. setup()
  2. dispatch()
  3. http_method_not_allowed()
  4. 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().get_redirect_url(*args, **kwargs)

Пример urls.py:

from django.urls import path
from django.views.generic.base import RedirectView

from article.views import ArticleCounterRedirectView, ArticleDetail

urlpatterns = [
    path('counter/<int:pk>/', ArticleCounterRedirectView.as_view(), name='article-counter'),
    path('details/<int:pk>/', ArticleDetail.as_view(), name='article-detail'),
    path('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/2.2/ref/class-based-views/base/

Spec-Zone.ru

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