クラスベースビューに関する詳細、パート2

読者の皆さん、こんにちは! 少し前まで、このトピックに関する記事の最初の部分を公​​開しました。 建設的な批判を表明してくれたすべてのユーザーに改めて感謝したいと思います。そのおかげで、記事の例はほぼ完璧に見えました。 同時に、このプレゼンテーション形式は非効率的であることに気付きました。クラスベースビュー(以下、CBVと呼びます)で実装されたメソッドをいくつか調べただけです。 2番目の部分では、フィードを作り直してから、APIで提示されるメソッドの最大数を説明することにしました。 また、前半で見逃していた方法についても説明します。 読者の建設的なサポートを心から願っており、将来、生産的な対話が行われ、その結果、記事がさらに有益になることを願っています。


パート1パート2パート3パート4

迅速なメソッド検索のリンク

派遣
get_context_data
get_template_names
get_context_object_name
得る
ポスト
置く
削除する

オプション
トレース
render_to_response
get_queryset

クイック属性検索のリンク

対象
template_name
template_name_suffix
context_object_name
http_method_names
クエリセット
モデル

一般的な情報

まず、これらのCBVが一般的に何であるか、それらが必要かどうか、どこで使用するかを決定します。 おそらく、Django開発者が特別な選択肢を提供していないことを強調する価値があるでしょう。 ほとんどの場合、バージョン1.4(トランクによる判断)から汎用ビューは非推奨として宣言され、次のバージョンの1つではそれらの使用をまったく拒否する可能性があります。 そのため、よくあることですが、長期的には勉強を延期するのではなく、今すぐCBVで仕事を始めることにしました。 実際、詳細な情報がないため、この記事は個人的な観察について書かれています。
したがって、CBVを使用すると、マッピングの開発でオブジェクト指向プログラミングの機能を使用できます。 これで、特定の機能を実行する基本クラスを実装し、マッピングのミックスインとして使用できます。

すべてのマッピングにはエントリポイントがあり、コンストラクターと見なすことができます。これはメソッドです 発送の このメソッドは、最初の引数として、HttpRequestオブジェクトのインスタンスであるリクエスト引数を受け入れます。 これは、関数ベースのビューとの主な類似点です。 また、このメソッドは、名前付きおよび名前なしの位置引数(* args / ** kwargs)としてマッピングに渡されるすべての変数を受け入れます。 このメソッドを使用したいくつかの例を考えてみましょう。
ディスパッチメソッドは、デコレータを使用するのに最適な場所です。 それらを指定するには、djangoに実装されているmethod_decoratorデコレータを使用する必要があります。 許可されたユーザーにのみ、オブジェクトの特定のリストへのアクセスを提供する必要があるとします。

from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.views.generic import ListView class PostList(ListView): model = Post @method_decorator(login_required()) def dispatch(self, request, *args, **kwargs): return super(PostList, self).dispatch(request, *args, **kwargs) 


ディスパッチメソッドが正しく動作するには、親ディスパッチャへのリンクを返す必要があることに注意してください。 そうしないと、コントロールが正しく転送されません。

多くの場合、ディスプレイに追加のコンテキストを伝えることが必要になります。 DetailViewクラスを使用して表示を実装する記事があるとします。 この記事のコメントのリストも取得する必要があります。 私の意見では、メソッド get_context_data
必要な機能を実装するのに最適なポイントになります。

 from django.views.generic.detail import DetailView from models import Post, Comment class PostDetail(DetailView): model = Post def get_context_data(self, **kwargs): context = super(PostDetail, self).get_context_data(**kwargs) context['comments'] = Comment.objects.filter(post=self.object, is_delete=False).order_by('-created_at') return context 


少し先を見て、属性を介してDetailViewを実装するときに現在のオブジェクトにアクセスできることを明確にします。 オブジェクト

マッピングを使用するテンプレートの名前を見つける(または設定する)場合は、メソッドに注意を払う必要があります get_template_names このメソッドは、指定された順序でDjangoが使用しようとするテンプレート名のリストを返します。 デフォルトでは、属性で指定されたテンプレートが最高の優先度を持ちます。 オブジェクトのtemplate_name 。 この属性が指定されていない場合、Djangoはテンプレート「application_name / object_name_prefix」の使用を試みます。 たとえば、コンテンツアプリケーションと投稿モデルの場合、このパスは「content / post_prefix.html」のようになります。 プレフィックスは属性を使用して設定されます template_name_suffix 、またはデフォルトのプレフィックスがこのタイプの表示に使用されます。 たとえば、ListViewの場合、プレフィックスの名前は「_list」、DetailViewの場合は「_detail」です。 表示に必要なテンプレートを使用する場合は、template_name属性を使用して指定するだけです。 独自のルールに従ってテンプレート名を収集する必要がある場合は、get_template_namesメソッドをオーバーライドする必要がある場合があります。

多くの場合、テンプレートでオブジェクト(またはオブジェクトのリスト)を使用できる変数の名前を変更する必要があります。 この機能を担当するメソッドの名前は get_context_object_name 。 このメソッドは、オブジェクト(またはオブジェクトのリスト)を引数として受け取ります。 単一のオブジェクトの場合、テンプレート内の変数名はデフォルトでオブジェクト自体の名前になります。 オブジェクトのリストの場合、これは接尾辞_listが付いたオブジェクトの名前になります。 たとえば、Postオブジェクトの場合、変数名は、単一のオブジェクトの場合はpost、オブジェクトのリストの場合はpost_listになります。 値を属性に割り当てると、変数の名前を明示的に指定できます context_object_name

RESTfulアプリケーションを実装するタスクに直面していることを想像してください。CBVは、実装のための包括的なメソッドセットを提供します。 特定のメソッドを使用してアプリケーションを実装するには、マッピングで同じ名前のメソッドを再定義するだけです。 利用可能なメソッドのリスト: 得る ポスト 置く 削除する オプショントレース getメソッドを使用してフォームを表示し、その処理をpostメソッドに転送できるため、フォームの操作が大幅に簡素化されます。 追加の特定のhttpメソッドを追加する必要がありますか? 問題ありません、属性を追加するだけです 使用可能なメソッドの名前のリストを含むhttp_method_namesを表示し、表示で同じ名前のメソッドを定義します。 すべてのhttpメソッドは、HttpResponseオブジェクトを返す必要があります。 表示テンプレートをレンダリングする必要がある場合は、上記のhttpメソッドでメソッドを呼び出すことができます render_to_response 。 このメソッドには、対応する機能と同じ名前だけでなく、同様の機能もあります。

 class PostDetail(DetailView): model = Post def get(self, request, **kwargs): return self.render_to_response(self.get_context_data(), **kwargs) 


メソッドは、引数として必要なコンテキストを取ります。

テンプレートに情報を表示する前に、それを取得する必要があります。 この方法はこれに役立ちます。 QuerySetオブジェクトを返すことをタスクとするget_queryset 。 デフォルトでは、このメソッドは属性を返します。 定義されている場合はqueryset 、または属性で指定されているモデルのすべてのオブジェクトのリスト モデル ニーズに合わせてこのメソッドをオーバーライドできます。

 class PostList(ListView): model = Post def get_queryset(self): qs = Post.objects.filter(is_delete=False).order_by('-created_at') if not self.request.user.is_authenticated(): return qs.exclude(is_private=True) return qs 


このパートでは、すべての基本(すべてのタイプのCBVで利用可能)メソッドを可能な限りカバーするようにしました。 私が何かを逃した場合は、お知らせください、私は記事を補足します。 次の部分には、CBVの個々のタイプの機能の説明が含まれます。 おそらく、ListViewメソッドとDetailViewメソッドの説明から始めましょう。 私の記事が人々が情報を見つけるのを助けるなら、私はとても幸せです。 この記事を読んでくれてありがとう:)

Source: https://habr.com/ru/post/J137223/


All Articles