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

Nik*_*nko 6 django overriding decorator django-class-based-views

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

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

由于基于类的意见通常由代表as_view()法,看来我需要来装饰它,但是,因为它是一个类的方法,我真的不能访问实例有,这我当然面包屑依靠.

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

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

Nik*_*nko 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
Run Code Online (Sandbox Code Playgroud)


小智 1

我想你可以在 urls.py 中做这样的事情:

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

urlpatterns = patterns('',
    url(r'^$', the_view, name='app_index'),
    ...
)
Run Code Online (Sandbox Code Playgroud)

as_view 方法返回一个可调用的,并且可以被修饰。“@”语法只是第 2 行所执行操作的快捷方式。