6

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

django-navigation用来创建面包屑。它的工作原理是这样的:一个视图函数被装饰,这个装饰器在该函数上引入了一个名为breadcrumb. 在模板中,当前 URL 或其部分得到解析,并检查结果视图的该属性。如果存在,则对其进行评估,结果是面包屑文本。

由于基于类的视图通常由as_view()方法表示,看来我需要装饰它,但是,由于它是一个类方法,我不能真正访问那里的实例,我的面包屑当然取决于它。

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

任何想法如何正确集成面包屑装饰器和基于类的视图?

4

2 回答 2

11

我现在像这样解决了这个问题。我已将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
于 2011-09-05T16:10:27.163 回答
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 方法返回一个可调用的,并且可以进行装饰。'@'-syntax 只是第 2 行的快捷方式。

于 2011-09-05T09:57:46.520 回答