Как переопределить `as_view` в представлениях на основе классов в Django? - PullRequest
6 голосов
/ 05 сентября 2011

Я пытаюсь внедрить классовые представления в моем проекте. До сих пор выглядел хорошо, пока не нашел следующую проблему.

Я использую django-navigation для создания панировочных сухарей. Это работает следующим образом: функция представления оформляется, и этот декоратор вводит атрибут для этой функции, называемый breadcrumb. В шаблоне разрешается текущий URL-адрес или его часть, а полученный атрибут проверяется на наличие этого атрибута. Если он есть, он оценивается, и результатом является текст крошки.

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

Присоединение атрибута breadcrumb к as_view() в __init__() тоже не сработало, или я неправильно понял синтаксис. РЕДАКТИРОВАТЬ : Конечно, это не сработало, поскольку я прикрепил его к as_view, а не к его возвращаемому значению.

Есть идеи, как правильно интегрировать этот декоратор и представления на основе классов?

Ответы [ 2 ]

8 голосов
/ 05 сентября 2011

Я решил это сейчас вот так. Я поместил свою подпрограмму breadcrumb в метод дочернего класса и переопределил as_view в базовом представлении. Также использовал трюк из фактического as_view, чтобы получить указатель self.

@classonlymethod
def as_view(cls, **initkwargs):
    self = cls(**initkwargs)
    view = super(MyBaseView, cls).as_view(**initkwargs)
    if hasattr(self, 'breadcrumb') and callable(getattr(self, 'breadcrumb', None)):
        return breadcrumb(self.breadcrumb)(view)
    return view
1 голос
/ 05 сентября 2011

Полагаю, вы можете сделать что-то подобное в urls.py:

.
the_view = ListView.as_view(...)
the_view = the_decroator(the_view)

urlpatterns = patterns('',
    url(r'^$', the_view, name='app_index'),
    ...
)

Метод as_view возвращает вызываемый объект, который можно оформить. Синтаксис '@' - это просто сокращение для того, что делается в строке 2.

...