34

Django のクラス ベース ビュー (CBV) を試しています。

class BlahView(TemplateView):
    template_name = 'blah/blah.html'
    def get_context_data(self, **kwargs):
        #code...

    def get(self, request, **kwargs):
        #more code...

これで、self.request からリクエスト パラメータを取得できることがわかりました。ここで、これらのリクエスト パラメータを解析し、クラス内に保存するとします。に保管できますself.xxxか?さて、明らかにクラスがどのように機能するかに基づいて、これは簡単に思えます。

Viewしかし、 (のスーパークラス)の定義を見ても、制御の流れがわかりませんTemplateViewソースas_view()は「エントリーポイント」であると述べています

インスタンス変数を最初に設定することを考えましたget_context_data()が、そこで初期化を行うのは正しくないようです。

__init__()CBVに を定義できますか? もしそうなら、スレッド化の問題や、解析されたデータのグローバルインスタンスで複数のページアクセスが機能する可能性がありますか?

少し面倒に聞こえるかもしれませんが、CBV のコード フローについて少し混乱しています。

4

2 に答える 2

56

のソースによるとdjango.views.generic.base.View.as_view

  • django の起動時に、as_view() は呼び出されないview関数を返します
  • 要求に応じview() 呼び出され、クラスをインスタンス化して呼び出すdispatch()
  • クラスインスタンスはスレッドセーフです

のソースによるとdjango.views.generic.base.View.__init__、リクエスト オブジェクトはこの時点で範囲外であるため、独自のコンストラクター オーバーロードで解析することはできません。

ただし、リクエストを解析し、のオーバーロードでクラスビューインスタンス属性を設定できます。これは、ソースdjango.views.generic.base.View.dispatchによると安全です:

class YourView(SomeView):
    def dispatch(self, request, *args, **kwargs):
        # parse the request here ie.
        self.foo = request.GET.get('foo', False)

        # call the view
        return super(YourView, self).dispatch(request, *args, **kwargs)
于 2012-07-12T09:31:14.397 に答える
2

@jpic は素晴らしい回答を提供してくれました。それに触発されて、著者が主張している次のブログ投稿を参照したいと思います。

... ビューをオーバーライドすることはできません。そうすると、as_view() をオーバーライドする必要があります。dispatch() をオーバーライドすることは魅力的です (そして、私がこの講演を行ったときに私が最初に行ったこと) は、単一の簡単な場所を提供するためです。しかし、これは dispatch() のロジックに反しています。代わりに、get() と post() の両方のオーバーライドで set_account() を呼び出すのが最善です。...

getしたがって、メソッドまたはメソッドをオーバーライドして、任意の変数postを設定できます。self.whateverなんとなくすっきりした感じ。

于 2016-10-18T14:59:36.027 に答える