django アプリを作成するときは、FBV (関数ベースのビュー) を常に使用します。これは、扱いが非常に簡単だからです。しかし、ほとんどの開発者は、CBV (クラス ベース ビュー) を使用し、CBV で実装するのが面倒な複雑なビューの場合は FBV のみを使用する方がよいと述べています。
なんで?CBV を使用する利点は何ですか?
django アプリを作成するときは、FBV (関数ベースのビュー) を常に使用します。これは、扱いが非常に簡単だからです。しかし、ほとんどの開発者は、CBV (クラス ベース ビュー) を使用し、CBV で実装するのが面倒な複雑なビューの場合は FBV のみを使用する方がよいと述べています。
なんで?CBV を使用する利点は何ですか?
最も重要な利点は、継承です。大規模なプロジェクトでは、似たようなビューがたくさんある可能性があります。同じコードを何度も書くのではなく、単純にビューをベース ビューから継承させることができます。
また、django には、最も一般的なタスクのいくつかを実行するために使用できる汎用ビュー クラスのコレクションが付属しています。たとえば、DetailView クラスを使用して、モデルの 1 つから単一のオブジェクトを渡し、それをテンプレートでレンダリングして、http 応答を返します。URL conf に直接プラグインできます。
url(r'^author/(?P<pk>\d+)/$', DetailView.as_view(model=Author)),
または、カスタム機能で拡張できます
class SpecialDetailView(DetailView):
model = Author
def get_context_data(self, *args, **kwargs):
context = super(SpecialDetailView, self).get_context_data(*args, **kwargs)
context['books'] = Book.objects.filter(popular=True)
return context
これで、レンダリング用の book オブジェクトのコレクションがテンプレートに渡されます。
これを始めるのに良い場所は、ドキュメント(Django 4.0+) をよく読むことです。
アップデート
ccbv.co.ukには、既に利用可能なクラス ベースのビューに関する包括的で使いやすい情報があります。
私が DJango を使い始めたとき、学習曲線と少し複雑な構造のため、CBV を使用したことはありませんでした。早送りして 2 年が経ちましたが、FBV を使用しているのは数か所だけです。コードは非常にシンプルであり、シンプルであり続けると確信しています。
CBV とそれに付随する多重継承の主な利点は、シグナル、ヘルパー メソッド、コピー ペースト コードの記述を完全に回避できることです。特に、アプリが基本的な CRUD 操作よりもはるかに多くのことを行う場合。複数の継承を持つビューは、特に未知のコード ベースの場合、シグナルとヘルパー メソッドを含むコードのデバッグが何倍も簡単になります。
多重継承 CBV とは別に、ディスパッチ、テンプレートの取得、さまざまなリクエスト タイプの処理、テンプレート コンテキスト変数の受け渡し、フォームの検証などをすぐに実行できるさまざまなメソッドを提供します。これらにより、コードがモジュール化され、保守が容易になります。
ビューを拡張する実際の機会が見当たらない場合のほとんどで、私は FBV を使用してきました。docsに記載されているように、次の 2 つの特性が私のユースケースに適している場合は、CBV を使用することを検討します。
- 特定の HTTP メソッド (GET、POST など) に関連するコードの編成は、条件分岐の代わりに別のメソッドで対処できます。
- ミックスイン (多重継承) などのオブジェクト指向の手法を使用して、コードを再利用可能なコンポーネントに分解できます。