2011-09-05 95 views
5

我试图在我的项目中引入基于类的视图。目前看起来不错,直到我发现以下问题。我使用django-navigation创建面包屑。它的工作原理是这样的:一个视图函数被装饰,这个装饰器在该函数上引入一个名为breadcrumb的属性。在模板中,当前URL或其部分得到解决,并且检查结果视图以查找此属性。如果它在那里,它会被评估,结果是面包屑文本。如何覆盖Django中基于类的视图中的`as_view`?

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

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

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

回答

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行完成的快捷方式。

+0

你能做到这一点吗? 'url(r'^ $',the_decorator(ListView.as_view()),name ='app_index')'? –

+0

是的,你可以:) – nfg

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 
相关问题