DjangoのMixinとViewの組み合わせテクニック

2199 ワード

MixinとViewの機能は、Mixinがデータを提供し、Viewがテンプレートとレンダリングを提供することに分けられます.だから普通get_context_dataはMixin,get(),post(),head()がViewにある.MixinとViewは勝手に組み合わせられるものではなく,彼らの間の方法の解析順序,すなわちMRO(method resolution order)に注意しなければならない.以下では、コンビネーションを簡単に使用できるように、一般的なMROをいくつかリストします.
ContextMixin:直接get_ですcontext_dataはcontextデータを返すために使用されます.View:すべてのgetメソッド、postメソッドが呼び出されます.具体的には、これらの['get'、'post'、'put'、'delete'、'head'、'options'、'trace']は、Viewにはresponseが1つも返されていないので、Viewを継承するだけでは、getなどを書き換えてresponseを返さなければなりません.TemplateResponseMixin:だから、このMixinはTemplateの基本的な情報、つまりtemplateの名前を加えることになります.しかし、Template情報だけでは役に立たない.彼女はViewと連絡を取りたくないからだ.Viewと連絡を取りたいなら、render_を何とかしなければならない.to_responseはMROの呼び出し順序に挿入され,TemplateResponseMixinにはcontextの情報がない.参考になる方法は、TemplateViewの方法です.
上記の3つのクラスを見て、私たちは基本的に明確な認識を持つことができます.DjangoのMixinとViewは元の試行関数の3つのものを分けて、テンプレート(TemplateResponseMixin)、コンテキストデータ(ContextMixin)、これらを結びつける1つのもの(View)を担当しています.
TemplateView:TemplateViewはTemplateResponseMixin,ContextMixinおよびViewから継承するので、その呼び出しの構想は明確で、その中でgetメソッドを定義し、getメソッドを通じて上の3つのものを結びつける.TemplateViewのソースコードを見てみましょう
class TemplateView(TemplateResponseMixin, ContextMixin, View):
    """
    A view that renders a template.  This view will also pass into the context
    any keyword arguments passed by the url conf.
    """
    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)

短い3行のコードは上の最も基本的な3つのものを含んでいます.次は少し高級なMixinを見ることができます.例えばSingleObjectMixin SingleObjectMixinは継承字ContextMixinである,つまりコンテキストデータを返すというものが存在し,それを少しパッケージ化した,すなわちコンテキストデータにobjectの情報を加えた.これらの情報をどのように取得するかは、もちろんmodel、managerなどの方法で入手できます.どのようにobjectの情報に参加しますか、ここで使うのはget_ですobjectメソッド.そしてslug_によるとurl_kwargとpk_url_kwargはデータを取得します.具体的な手順はdjangoの公式ドキュメントを参照することができます.ここではソースコードの観点から直接見ています.具体的にはfilter文です.このSingleObjectMixinの目的はcontextデータのものを制限することです.
同じように、このような考え方で他のMixinとViewの問題を解決することができます.3つのものを覚えて分家すればいいのですが、最も重要なのはtemplateresponseとcontextで、それから接着剤viewです.実際に使用する過程で以下の図を参考にすることができます.
この図は基本的に重要なMixinとViewを示しています.もちろん、私たちは自分でMixinを実現して自分の機能を加えることができます.これは発揮できる場所です.