1. ホーム
  2. python

[解決済み] Django で get, get_queryset, get_context_data はいつ使うのか?

2022-12-03 22:41:54

質問

最近、getメソッドをオーバーライドするのは、デフォルトのビューが行うこと以外のことを特に行いたい場合であることを知りました。

class ExampleView(generic.ListView):
    template_name = 'ppm/ppm.html'

    def get(self, request):
        manager = request.GET.get('manager', None)
        if manager:
            profiles_set = EmployeeProfile.objects.filter(manager=manager)
        else:
            profiles_set = EmployeeProfile.objects.all()
            context = {
                'profiles_set': profiles_set,
                'title': 'Employee Profiles'
            }

これだけなら簡単ですが、どのような場合に get_queryset あるいは get_context_data 以上 get ? 私には、これらは基本的に同じことをするように見えますが、私は何かを見逃しているだけでしょうか?私はそれらを一緒に使用することができますか?これは、私にとって大きな混乱の原因です。

では、もう一度言います。どのような場合に get over get_queryset または get_context_data のどちらを使うか、またその逆は?

どのように解決するのですか?

確かに、それぞれ違うことをしていますね。

get()

これはトップレベルのメソッドで、各 HTTP 動詞に対して 1 つずつあります。 get() , post() , patch() などです。リクエストがビューによって処理される前、あるいは後に何かをしたいときに、 これをオーバーライドするでしょう。しかし、これはフォームビューが最初にロードされたときにのみ呼び出され、 フォームが送信されたときには呼び出されません。 ドキュメントにある基本的な例 . デフォルトでは、設定されたテンプレートをレンダリングして、HTMLを返すだけです。

class MyView(TemplateView):
    # ... other methods

    def get(self, *args, **kwargs):
        print('Processing GET request')
        resp = super().get(*args, **kwargs)
        print('Finished processing GET request')
        return resp

get_queryset()

使用者 ListView によって使用されます - 表示したいオブジェクトのリストを決定します。デフォルトでは、指定されたモデルのすべてを表示します。このメソッドをオーバーライドすることで、このロジックを拡張したり、完全に置き換えたりすることができます。 この件に関する Django のドキュメント .

class FilteredAuthorView(ListView):
    template_name = 'authors.html'
    model = Author

    def get_queryset(self):
        # original qs
        qs = super().get_queryset() 
        # filter by a variable captured from url, for example
        return qs.filter(name__startswith=self.kwargs['name'])

get_context_data()

このメソッドは、テンプレートのコンテキストとして使用する辞書を生成するために使用されます。例えば ListView からの結果を入力します。 get_queryset() として author_list のようになります。おそらく、テンプレートに表示するものを追加するために、このメソッドをオーバーライドすることが最も多いでしょう。

def get_context_data(self, **kwargs):
    data = super().get_context_data(**kwargs)
    data['page_title'] = 'Authors'
    return data

そして、テンプレートの中で、これらの変数を参照することができます。

<h1>{{ page_title }}</h1>

<ul>
{% for author in author_list %}
    <li>{{ author.name }}</li>
{% endfor %}
</ul>


さて、あなたの主な質問に答えますと、これほど多くのメソッドを持つ理由は、カスタムロジックをピンポイントの精度で簡単に固めることができるからです。これにより、コードがより読みやすくモジュール化されるだけでなく、よりテストしやすくなります。

ドキュメント ですべて説明されているはずです。それでもまだ十分でない場合は ソース も役に立つかもしれません。すべてが区分けされているからこそ可能な、ミキシンを使った実装を見ることができます。