Представления на основе классов ¶
Представление - это исполняемый файл, который принимает запрос и возвращает ответ. Это не обязательно простая функция, и 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
указана дата самой последней публикации книги. На основании этой информации заказчик может решить, загружать или нет полный список объектов.