如何在Django的基于类的视图中覆盖`as_view`?

时间:2011-09-05 09:22:24

标签: django decorator override django-class-based-views

我正在尝试在我的项目中引入基于类的视图。到目前为止看起来很好,直到我发现以下问题。

我正在使用django-navigation来创建面包屑。它的工作方式如下:视图函数被装饰,这个装饰器在该函数上引入了一个名为breadcrumb的属性。在模板中,将解析当前URL或其部分,并检查生成的视图以查找此属性。如果它在那里,它被评估,结果是面包屑文本。

由于基于类的视图通常由as_view()方法表示,但似乎我需要修饰它,但是,因为它是一个类方法,我无法真正访问那里的实例,这是我的面包屑当然取决于。

breadcrumb中将as_view()属性附加到__init__()也不起作用,或者我的语法错误。 编辑当然它不起作用,因为我将其附加到as_view,而不是它的返回值。

如何正确整合面包屑装饰器和基于类的视图?

2 个答案:

答案 0 :(得分:8)

我现在已经解决了这个问题。我已将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 :(得分:1)

我想你可以在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行所做内容的快捷方式。