ご存知のとおり、django は Web アプリケーション開発の設計に MVT (model-view-template) を使用します。
View 自体は、リクエストを受け取り、レスポンスを返す呼び出し可能です。 Django はクラス ベース ビューと呼ばれるものを提供するため、これは単なる機能ではありません。そのため、開発者は、クラス ベースのアプローチ、または OOP アプローチを使用してビューを作成できます。このクラスベースのビューは、ビューを構造化し、継承とミックスインの力によって再利用できるように設計されています。
django のドキュメントに詳しく記載されているように、関数ベースのビューの問題の 1 つは、一部の構成オプションを超えてビューを拡張またはカスタマイズする方法がないため、多くの実世界のアプリケーションでの有用性が制限されてしまうことです。
django の基本クラスとミックスインのツールキットは、最大限の柔軟性を実現するように設計されています。ビュークラスの継承を使用して、Django で最も基本的なクラスベースのビューを使用する方法を見て、それを関数ベースのビューと比較してみましょう。
#views.py using View class inheritance from django.views import View from django.http import HttpResponse, HttpRequest class IndexView(View): def get(self, request: HttpRequest): # imagine 10 line of view logic here return HttpResponse("Hello world from indexview") def post(self, request: HttpRequest): # imagine 10 line of view logic here return HttpResponse("Hello world from indexview in post method")
#views.py function based view from django.http import HttpResponse, HttpRequest def index(request: HttpRequest): if request.method == "GET": # imagine 10 line of view logic here return HttpResponse("Hello world from index funcion view") elif request.method == "POST": # imagine 10 line of view logic here return HttpResponse("Hello world from index funcion view in post method")
上記を見ると、クラスベースのビューを使用すると、単一のビュー関数内の条件分岐コードを使用するのではなく、異なるクラス インスタンス メソッドを使用してさまざまな HTTP リクエスト メソッドに応答できます。上記の各ビューで、各メソッドに 10 行のロジックを追加したことを想像してください。どれがウォークスルーしやすいかわかるはずです。
クラスベースのビューを URL 設定に登録するには、基本的にクラス ビューを呼び出し可能な関数に変換する as_view() クラス メソッドを呼び出す必要があります。この変換された関数は、setup() を呼び出してその属性を初期化し、次にdispatch() を呼び出してユーザーがどのメソッド (GET、POST、またはその他のメソッド) を持っているかを確認し、クラスベースのビューが元々持っていた対応する一致するメソッドにリクエストメソッドを接続します。
#urls.py from django.urls import path from myapp.views import IndexView, index urlpatterns = [ path("", IndexView.as_view(), name=IndexView.__name__), path("index/", index, name=index.__name__), ]
クラスベースのビューは、テンプレートをレンダリングするための render() 関数など、django が持つすべての http ショートカット カットもサポートしています。これは、レンダリング ショートカットを使用し、django メッセージ フレームワークと連携した django cbv の変更例です。
class IndexView(View): def get(self, request: HttpRequest): # imagine 10 line of view logic here return render(request, "GEtindex.html") def post(self, request: HttpRequest): # imagine 10 line of view logic here messages.add_message(request, messages.INFO, "POST Success") #add display success message here by django messages framework return render(request, "POSTindex.html")
全体的に django クラスベースのビューを使用すると、開発者はビュー ロジックを理解しやすく書くことができます。ビュー ロジックが複雑になればなるほど、関数ベースのビューだけを使用すると、読みにくくなるのは間違いありません (if ステートメントが多すぎて内容を確認できません)一方、django cbv は、ビュー ロジックを get メソッドや post メソッドなどの複数のメソッドに分割するように設計されています。必要に応じて継承で再度使用することもできますが、クラス内に継承が増えると、その抽象化により読みにくくなるという意見もあります。
クラスベースのビューの詳細については、ここ、ここ、ここから始まる Django ドキュメントで確認できます
また、django のクラスベースのビューに焦点を当てた優れた代替ドキュメントは、ccbv.co.uk です。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3