Базовые виды

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

Многие встроенные в 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, а любые позиционные и/или ключевые аргументы captured from the URL pattern атрибутам args и kwargs соответственно. Затем вызывается dispatch().

setup(request, *args, **kwargs)

Выполняет инициализацию представления ключа перед dispatch().

Если вы переопределяете этот метод, вы должны вызвать super().

dispatch(request, *args, **kwargs)

Часть представления view – метод, который принимает аргумент request плюс аргументы и возвращает HTTP-ответ.

Реализация по умолчанию будет проверять метод 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).

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

** Блок-схема метода**

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

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

** Блок-схема метода**

  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, ArticleDetailView

urlpatterns = [
    path('counter/<int:pk>/', ArticleCounterRedirectView.as_view(), name='article-counter'),
    path('details/<int:pk>/', ArticleDetailView.as_view(), name='article-detail'),
    path('go-to-django/', RedirectView.as_view(url='https://www.djangoproject.com/'), name='go-to-django'),
]

Атрибуты

url

URL для перенаправления в виде строки. Или None, чтобы выдать ошибку 410 (Ушел) HTTP.

pattern_name

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

permanent

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

query_string

Передавать ли строку запроса GET в новое местоположение. Если True, то строка запроса добавляется к URL. Если False, то строка запроса отбрасывается. По умолчанию query_string равно False.

Методы

get_redirect_url(*args, **kwargs)

Создает целевой URL для перенаправления.

Аргументы args и kwargs являются позиционными и/или ключевыми аргументами captured from the URL pattern, соответственно.

Реализация по умолчанию использует url в качестве начальной строки и выполняет расширение именованных параметров % в этой строке, используя именованные группы, захваченные в URL.

Если url не установлено, get_redirect_url() пытается обратить pattern_name, используя то, что было захвачено в URL (используются как именованные, так и неименованные группы).

При запросе query_string он также добавит строку запроса к сгенерированному URL. Подклассы могут реализовать любое поведение по своему усмотрению, лишь бы метод возвращал готовую к перенаправлению строку URL.

Вернуться на верх