Встроенный API представлений на основе классов

Справочник по API представления на основе классов. Для получения вводного материала см. тематическое руководство Представления на основе классов.

Спецификация

Каждый запрос, обслуживаемый представлением на основе класса, имеет независимое состояние; поэтому безопасно хранить переменные состояния на экземпляре (т.е. self.foo = 3 является потокобезопасной операцией).

Представление на основе класса развертывается в шаблон URL с помощью as_view() classmethod:

urlpatterns = [
    path('view/', MyView.as_view(size=42)),
]

Безопасность потоков с аргументами представления

Аргументы, передаваемые в представление, разделяются между всеми экземплярами представления. Это означает, что вы не должны использовать список, словарь или любой другой изменяемый объект в качестве аргумента представления. Если вы это сделаете, и общий объект будет изменен, действия одного пользователя, посетившего ваше представление, могут повлиять на последующих пользователей, посетивших то же представление.

Аргументы, переданные в as_view(), будут присвоены экземпляру, который используется для обслуживания запроса. Используя предыдущий пример, это означает, что каждый запрос на MyView сможет использовать self.size. Аргументы должны соответствовать атрибутам, которые уже существуют в классе (возврат True при проверке hasattr).

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

Представления на основе базовых классов можно рассматривать как родительские представления, которые могут использоваться сами по себе или наследоваться от них. Они могут не предоставлять всех возможностей, необходимых для проектов, в этом случае существуют Миксины, которые расширяют возможности базовых представлений.

Общие представления Django построены на основе этих базовых представлений и были разработаны как кратчайший путь к распространенным шаблонам использования, таким как отображение деталей объекта. Они берут определенные общие идиомы и паттерны, встречающиеся в разработке представлений, и абстрагируют их, чтобы вы могли быстро писать общие представления данных без необходимости повторяться.

Для большинства общих представлений требуется ключ queryset, который является экземпляром QuerySet; более подробную информацию об объектах Создание запросов смотрите в QuerySet.

Вернуться на верх