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

読者のみなさん、また挨拶します! Djangoのクラスベースビュー(以降CBV)に関するシリーズから別の記事を公開しています。 今回は、計画どおり、ListView(オブジェクトのリストの表示を担当)とDetailView(個々のオブジェクトに関する情報の表示を担当)を検討したいと思います。



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



また、以前と同様に、読者からのフィードバックを歓迎します。記事に誤りや不正確な点がある場合は、お知らせください。記事を一緒に改善します。



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


get_paginate_by

get_allow_empty

get_context_object_name

get_object

get_slug_field



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


paginate_by

paginator_class

allow_empty

context_object_name

対象

slug_field



オブジェクトのリストを表示する


間違いなく、この操作は大多数のプロジェクトで必要であり、幸いなことに、フレームワークのDjango開発者によって提供されます。 前の部分で説明したメソッドと属性は、追加の説明を必要としないので、新しいものと遭遇したものだけを考慮します。



膨大な数のオブジェクトを表示する必要がある場合、それらをすべて同時に表示することは非常に望ましくありません。 この場合、データのページネーション(ページネーション)にメカニズムが必要です。 DetailViewクラスは、必要な機能を実装するMultipleObjectMixinの混合物を継承します。 ページごとのオブジェクトの数を決定するには、メソッドを使用します get_paginate_by 。デフォルトで属性値を返します paginate_by 。 この属性を使用すると、1ページに表示されるオブジェクトの数をあまり手間をかけずに指定できます。

ページネーションを独自の方法で実装することが必要になる場合があります。これは、ページネーションクラスを属性に渡すことができるため paginator_class 。 デフォルトでは、この属性には、django.core.paginatorモジュールに実装されている標準のPaginatorクラスへのリンクが含まれています。 まだ変更する場合はよく考えて、必要な機能が最初に使用可能かどうかを確認してください。

属性 allow_emptyは、リストにオブジェクトがない場合の状況の処理方法を定義します。 この属性の値をTrue(デフォルト)に設定すると、オブジェクトの空のリストが返されます。 値がFalseの場合、エラー404が返されます。この属性の値はメソッドによって返されます get_allow_empty 。 追加の検証やロジックの変更が必要な場合にも使用できます。

テンプレートでは、オブジェクトのリストは名前で利用できます。これは属性を使用して指定されます context_object_name (またはメソッドによって返された get_context_object_nameについては、前の記事で説明しました)。 現在のページのオブジェクトは、という名前の変数にあります object_list 。 変数値 is_paginated (boolean)は、オブジェクトのリストがページネーションされるかどうかを決定します。 ページネーションシステムの詳細については、 ドキュメントをご覧ください。

属性 object_listは、オブジェクトのリストを格納します。 正しい操作のために現在のページをディスプレイに転送することを忘れてはならないことに注意してください。 最も簡単な方法は、urls.pyファイルで名前付きグループを使用することです



url(r'^page/(?P<page>\d+)/$', PrivatePostList.as_view()),
      
      







小規模なユースケースで説明を希釈します。

 # coding: utf-8 from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.views.generic.list import ListView from content.models import Post class PrivatePostList(ListView): model = Post paginate_by = 10 context_object_name = 'posts' template_name = 'private_posts.html' @method_decorator(login_required) def dispatch(self, request, *args, **kwargs): """    login_required,       """ return super(PrivatePostList, self).dispatch(request, *args, **kwargs) def get_queryset(self): """             """ return Post.objects.filter(is_private=True, is_deleted=False)
      
      





そして、大まかに言うと、テンプレートでは次のようになります。



 {% extends 'base.html' %} {% block title %}  {% endblock %} {% block content %} {% for post in object_list %} <div class="post"> <div class="post_name">{{ post.name }}</div> <div class="post_text">{{ post.text|safe }}</div> <div class="post_info">{{ post.author.username }}, {{ post.created_at|date:"dmY  H:i" }}</div> </div> {% empty %} <p>   :(</p> {% endfor %} {% if paginator.num_pages > 1 %} {% if page_obj.has_previous %} <a href="/page{{ page_obj.previous_page_number }}/">&larr;</a> {% endif %} <span class="current_page">{{ paginator.number }}</span> {% if page_obj.has_next %} <a href="/page{{ page_obj.next_page_number }}">&rarr;</a> {% endif %} {% endif %} {% endblock %}
      
      







この段階で、DetailView機能の検討を終了することは可能だと思いますが、それでも重要な何かを見逃した場合はお知らせください。記事を補足します。



個々のオブジェクトに関する情報を表示する


ここで、単一オブジェクトの表示を担当するDetailViewクラスの機能を検討します。

単一のオブジェクトを取得するには、何らかのパラメーターでそれを識別する必要があります。 通常、いわゆる一意のプライマリキー(pk、id)がこれに使用されます。 Djangoでは、スラッグフィールドによってオブジェクトを識別することもできます。スラッグフィールドは、任意の一意の単語にすることができます。 もちろん、オブジェクトが記事またはユーザーのリストである場合(たとえば、Habréの場合)、SEOがslugを使用する方が便利な場合があります。 ただし、他の場合では、識別にスラッグを使用しても意味がありません(たとえば、コメントや個人的なメッセージの表示)。 そのような場合、主キーが使用されます。

オブジェクトを識別する方法を選択したら、urls.pyファイルのルートを使用して、対応する名前の変数を渡すことにより、Djangoに選択を通知する必要があります。

 url(r'^post/(?P<pk>\d+)/$', PostDetail.as_view()),
      
      





受け入れるオブジェクトを識別する方法が何であれ、メソッドを使用してオブジェクトにアクセスできます get_object 。 このメソッドは、ルート内の変数pkとスラッグを交互に見つけようとします。この場合、pkという名前の変数の優先度が高くなります。 使用方法 get_slug_fieldモデルのスラグフィールド名を再定義できます。 デフォルトでは、このメソッドは属性値を返します。 slug_field 。 オブジェクトは属性に保存されます オブジェクト



 from django.http import Http404 from django.views.generic.detail import DetailView from content.models import Post class PostView(DetailView): model = Post context_object_name = 'post' template_name = 'private_post_detal.html' def get_object(self): """     404            login_required """ object = super(PostView, self).get_object() if not self.request.user.is_authenticated(): raise Http404 return object
      
      







この時点で、ListViewクラスとDetailViewクラスの説明を終了できると思います。 次の記事では、FormViewとフォームの操作について書きます。 読んでくれてありがとう。 いつものように、私は批判やバグの報告を受け入れています。 楽しい週末をお過ごしください!)



All Articles