Основанные на классах представления
Представление — это вызываемая функция, которая принимает запрос и возвращает ответ. Это может быть больше, чем просто функция, и Django предоставляет примеры некоторых классов, которые могут использоваться в качестве представлений. Это позволяет структурировать представления и повторно использовать код, используя наследование и миксины. Также есть некоторые обобщенные представления для простых задач, о которых мы поговорим позже, но вы можете разработать собственную структуру повторно используемых представлений, подходящих для вашего случая. Для получения полной информации см. документацию по представлениям, основанным на классах.
- Введение в представления, основанные на классах
- Встроенные обобщенные представления, основанные на классах
- Обработка форм с помощью представлений, основанных на классах
- Использование миксинов с представлениями, основанными на классах
Основные примеры
Django предоставляет базовые классы представлений, которые подойдут для широкого спектра приложений. Все представления наследуются от класса View, который обрабатывает связывание представления с URL-адресами, диспетчеризацию HTTP-методов и другие простые функции. RedirectView предназначен для простого HTTP-перенаправления, а TemplateView расширяет базовый класс, чтобы также отображать шаблон.
Простое использование в вашем URLconf
Самый простой способ использования обобщенных представлений — создать их непосредственно в вашем URLconf. Если вы только изменяете несколько простых атрибутов представления, основанного на классе, вы можете просто передать их в сам вызов метода as_view():
from django.conf.urls import url
from django.views.generic import TemplateView
urlpatterns = [
url(r'^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.conf.urls import url
from some_app.views import AboutView
urlpatterns = [
url(r'^about/$', AboutView.as_view()),
]
Для получения дополнительной информации о том, как использовать встроенные обобщенные представления, см. следующий раздел по обобщенным представлениям, основанным на классах.
Поддержка других HTTP-методов
Предположим, кто-то хочет получить доступ к нашей библиотеке книг через HTTP с помощью представлений в качестве API. Клиент API будет время от времени подключаться и загружать данные о книгах, опубликованных после последнего посещения. Но если с тех пор новые книги не появились, то извлечение книг из базы данных, создание полного ответа и отправка его клиенту — это пустая трата времени ЦП и пропускной способности. Возможно, будет предпочтительнее спросить API, когда была опубликована самая последняя книга.
Мы сопоставляем URL-адрес с представлением списка книг в URLconf:
from django.conf.urls import url
from books.views import BookListView
urlpatterns = [
url(r'^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/1.11/topics/class-based-views/index/