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 メソッドは呼び出し可能なものを返し、それを装飾することができます。「@」構文は、2 行目で行われることの単なるショートカットです。

于 2011-09-05T09:57:46.520 に答える