Это нетривиально невозможно, нет, проще всего было бы на самом деле написать собственный обработчик контекста шаблона , который проверяет, например, установлено ли что-то вроде GET['preview']
, затем устанавливает значения словаря на основе некоторых других ПОЛУЧИТЬ или ПОСТИТЬ данные. Кроме того, при добавлении других переменных следует убедиться, что они не перезаписывают существующие значения, установленные этим методом (в противном случае представление переопределит его в любом случае с некоторыми другими данными).
Однако, одно замечание: совершенно ненавязчивое поведение часто приводит к ошибочному поведению. Если представление не знает об этой функции предварительного просмотра и, например, он ожидает действительный идентификатор или перенаправляет на страницу ошибки, ваш предварительный просмотр не будет работать (так как у вас нет действительного идентификатора). Выбор представлений, которые знают об этой функции предварительного просмотра, действительно является дополнительной работой, но, безусловно, будет правильным. Вы можете попытаться сделать его более универсальным, используя декораторы или вызываемые классы представления (которые могут быть получены из некоторой общей базы) вместо методов представления.
Совершенно другой подход, который лишь немного «нагляден», я предполагаю, что вы не хотите сохранять модель, чтобы она не отображалась в общедоступных списках. Подход может состоять в том, чтобы добавить поле «предварительного просмотра» и использовать менеджеры для ограничения поиска, поэтому что-то вроде этого:
класс NoPreviewManager (models.Manager):
def get_query_set (self):
вернуть супер (MyModelManager, self) .get_query_set (). filter (preview = False)
класс MyModel (models.Model):
... # другие поля
preview = models.BooleanField ()
objects = NoPreviewManager()
allobjects = models.Manager()
Во всех обычных представлениях вы можете просто использовать MyModel.objects
, чтобы превью не отображалось. В объектно-ориентированном представлении вы используете MyModel.allobjects
, чтобы также включить по умолчанию предварительные просмотры. Таким образом, вам не нужно совершать странные представления, угоняющие вещи, но вы должны позаботиться о том, чтобы объекты предварительного просмотра были очищены, если они не превращены в реальные объекты. Обратите внимание, что вы также можете объединить многие из этой логики в базовый класс.