Базовые представления на основе классов
Представление — это вызываемый объект, который принимает запрос и возвращает ответ. Это может быть не просто функция, и Django предоставляет примеры некоторых классов, которые можно использовать в качестве представлений. Это позволяет структурировать ваши представления и повторно использовать код, используя наследование и миксины. Также есть некоторые обобщённые представления для задач, о которых мы поговорим позже, но вы можете разработать свою собственную структуру повторно используемых представлений, соответствующую вашим потребностям. Более подробную информацию см. в документации по представлениям на основе классов.
- Введение в представления на основе классов
- Встроенные обобщённые представления на основе классов
- Обработка форм с представлениями на основе классов
- Использование миксинов с представлениями на основе классов
Основные примеры
Django предоставляет базовые классы представлений, которые подойдут для широкого круга приложений. Все представления наследуют от класса View, который обрабатывает связывание представления с URL-адресами, диспетчеризацию HTTP-методов и другие общие функции. RedirectView обеспечивает HTTP-перенаправление, а TemplateView расширяет базовый класс, чтобы он также рендерил шаблон.
Использование в вашем URLconf
Самый прямой способ использования обобщённых представлений — создание их непосредственно в вашем URLconf. Если вы только изменяете несколько атрибутов представления на основе класса, вы можете передать их в вызов метода 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"
Затем нам нужно добавить это новое представление в наш URLconf. TemplateView — это класс, а не функция, поэтому мы указываем URL-адрес на метод класса as_view(), который предоставляет функциональный способ доступа к представлениям на основе классов:
# urls.py
from django.urls import path
from some_app.views import AboutView
urlpatterns = [
path('about/', AboutView.as_view()),
]
Для получения дополнительной информации о том, как использовать встроенные обобщённые представления, см. следующий раздел о обобщённых представлениях на основе классов.
Поддержка других HTTP-методов
Предположим, кто-то хочет получить доступ к нашей библиотеке книг через HTTP, используя представления как API. Клиент API будет время от времени подключаться и загружать данные о книгах, опубликованных после последнего посещения. Но если новые книги с тех пор не появились, извлекать книги из базы данных, рендерить полный ответ и отправлять его клиенту — пустая трата времени процессора и пропускной способности. Возможно, было бы предпочтительнее запросить у API время последнего опубликования книги.
Мы сопоставляем URL-адрес со списком книг в URLconf:
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 указывает время последнего опубликования книги. На основании этой информации клиент может или не может загружать весь список объектов.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.0/topics/class-based-views/index/