2011-09-05 11 views
5

私はプロジェクトにクラスベースのビューを導入しようとしています。私は次の問題を見つけるまで、これまで良い見えた。Djangoのクラスベースのビューで `as_view`をどのようにオーバーライドしますか?

パンくずリストを作成するのに私はdjango-navigationを使用しています。これは次のように機能します:ビュー関数が装飾され、このデコレータはbreadcrumbというその関数の属性を導入します。テンプレートでは、現在のURLまたはその部分が解決され、結果のビューがこの属性に対してチェックされます。それがあれば評価され、結果はブレッドクラムのテキストになります。

通常、クラスベースのビューはas_view()メソッドで表されるため、クラスメソッドであるため、私はそれを装飾する必要があるようですが、私のパンくずリストはもちろんそのインスタンスにアクセスできませんに。

__init__()as_view()に属性breadcrumbを添付しても機能しないか、構文が正しくありません。 EDIT私はそれを戻り値ではなく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

これを1行で入力できますか? '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 
関連する問題