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

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

Основные примеры

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

Использование в конфигурации URL

Самый прямой способ использовать общие представления - создать их прямо в конфигурации URL. Если вам нужно изменить только небольшое количество атрибутов в представлении на основе классов, вы можете передать их непосредственно в вызов метода as_view() :

from django.urls import path
from django.views.generic import TemplateView

urlpatterns = [
    path('about/', TemplateView.as_view(template_name="about.html")),
]

Любой переданный параметр as_view() перегружает атрибут с тем же именем класса. В этом примере мы определяем template_name представление TemplateView . Же система перегрузки может быть использована для атрибута url из RedirectView .

Наследование общих представлений

Другой, более мощный способ использования общих представлений - это наследование от существующего представления и переопределение его атрибутов (например template_name ) или методов (например get_context_data ) в вашем подклассе для предоставления других значений или методов. , Например, рассмотрим представление, в котором отображается только шаблон about.html . В Django для этого есть общее представление, поэтому TemplateView мы можем унаследовать его и переопределить переменную с именем шаблона:

# some_app/views.py
from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = "about.html"

Затем вам нужно добавить это новое представление в конфигурацию URL. Поскольку TemplateView это класс, а не функция, необходимо сопоставить URL-адрес с методом класса, as_view() который является точкой входа типа функции для представлений на основе классов:

# urls.py
from django.urls import path
from some_app.views import AboutView

urlpatterns = [
    path('about/', AboutView.as_view()),
]

Дополнительные сведения о том, как использовать общие представления, встроенные в Django, см. В следующем разделе об общих представлениях на основе классов .

Поддержка альтернативных методов HTTP

Предположим, кто-то хочет получить доступ к нашей библиотеке книг через HTTP, используя представления в качестве API. Клиент этого API будет время от времени входить в систему и загружать данные из книг, опубликованных с момента их последнего посещения. Но если за это время публикация не состоялась, извлечение книг из базы данных, получение полного ответа и отправка его клиенту было бы пустой тратой процессорного времени и полосы пропускания. Возможно, лучше запросить у API самую последнюю дату выпуска.

Мы сопоставляем URL-адрес со списком книг в конфигурации URL:

from django.urls import path
from books.views import BookListView

urlpatterns = [
    path('books/', BookListView.as_view()),
]

И вид:

from django.http import HttpResponse
from django.views.generic import ListView
from books.models import Book

class BookListView(ListView):
    model = Book

    def head(self, *args, **kwargs):
        last_book = self.get_queryset().latest('publication_date')
        response = HttpResponse()
        # RFC 1123 date format
        response['Last-Modified'] = last_book.publication_date.strftime('%a, %d %b %Y %H:%M:%S GMT')
        return response

Если доступ к представлению осуществляется через запрос GET , в ответе возвращается список объектов (с использованием шаблона book_list.html ). Но если клиент инициирует запрос HEAD , тело ответа будет пустым, а в заголовке будет Last-Modified указана дата самой последней публикации книги. На основании этой информации заказчик может решить, загружать или нет полный список объектов.

Copyright ©2020 All rights reserved