Spec-Zone.ru › Django 1.10

Базово-ориентированные представления

Представление — это вызываемый объект, который принимает запрос и возвращает ответ. Это может быть не только функция, 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.10/topics/class-based-views/index/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API