[解決済み] Django で get, get_queryset, get_context_data はいつ使うのか?
質問
最近、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>
さて、あなたの主な質問に答えますと、これほど多くのメソッドを持つ理由は、カスタムロジックをピンポイントの精度で簡単に固めることができるからです。これにより、コードがより読みやすくモジュール化されるだけでなく、よりテストしやすくなります。
ドキュメント ですべて説明されているはずです。それでもまだ十分でない場合は ソース も役に立つかもしれません。すべてが区分けされているからこそ可能な、ミキシンを使った実装を見ることができます。
関連
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] リストの要素数を取得する方法
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] virtualenvで異なるバージョンのPythonを使用する
-
[解決済み] Djangoのバージョンを確認する方法
-
[解決済み】Djangoでnull=Trueとblank=Trueの違いは何ですか?
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] Python Empty Generator 関数
-
[解決済み] Pythonの検索パスを他のソースに展開する
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?