Представления на основе классов ¶
Представление - это вызываемый объект, который принимает запрос и возвращает ответ. Это может быть больше, чем просто функция, и 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
- это класс, а не функция, поэтому as_view()
вместо этого мы указываем URL-адрес на метод класса, который предоставляет функционально-подобную запись для представлений на основе классов:
# 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.
headers={'Last-Modified': last_book.publication_date.strftime('%a, %d %b %Y %H:%M:%S GMT')},
)
return response
Если доступ к представлению осуществляется из GET
запроса, в ответе возвращается список объектов (с использованием book_list.html
шаблона). Но если клиент отправляет HEAD
запрос, ответ имеет пустое тело, а Last-Modified
заголовок указывает, когда была опубликована самая последняя книга. Основываясь на этой информации, клиент может или не может загружать полный список объектов.