16

ブログアプリケーションでDjangoのクラスベースのジェネリックビューを使用しています。ビューの1つに、特定のタグが付いた投稿のリストが表示されます。このビューは、ListViewタグでフィルタリングされた投稿として記述できます。または、このビューをDetailViewタグのとして記述し、関連する投稿をコンテキストに追加することもできます。

一方の方法はもう一方の方法よりも適切ですか(またはPythonic)?

私が欲しいのは投稿のリストであるため、このListViewアプローチはよりセマンティックに見えますが、少し複雑でもあります。2つのメソッドを上書きする必要があります。このアプローチでは、1つのメソッドを上書きするだけで済みます。DetailView

class PostTagView(ListView):
    """Display all blog posts with a given tag."""
    queryset = Post.objects.published()

    def get_context_data(self, **kwargs):
        context = super(PostTagView, self).get_context_data(**kwargs)
        context['tag'] = get_object_or_404(Tag, slug=self.kwargs['slug'])
        return context

    def get_queryset(self, **kwargs):
        queryset = super(PostTagView, self).get_queryset()
        return queryset.filter(tags__slug=self.kwargs['slug'])


class TagDetailView(DetailView):
    """Display all blog posts with a given tag."""
    model = Tag

    def get_context_data(self, **kwargs):
        context = super(TagDetailView, self).get_context_data(**kwargs)
        context['object_list'] = Post.objects.published().filter(tags__slug=self.kwargs['slug'])
        return context
4

4 に答える 4

10

経験則として、URLのパラメーターを確認してください。のを使用している場合はslugTagを扱っている可能性が高く、ではDetailViewありませんListView

この場合、2番目のアプローチは使用するコードが少なく、よりエレガントです。ただし、後でビューをどのように処理するかによっても異なります。ListView投稿を編集するためのフォームを追加する場合は、代わりに使用するのが理にかなっている場合があります。しかし、どちらか一方を優先する技術的な理由はありません。一方のアプローチで他方よりも多くのコードを記述してしまう可能性があるからです。

于 2012-03-19T20:21:14.943 に答える
4

ListViewとDetailViewは技術的に同じではありません。たとえば、urls.pyで以下のようなDetailViewのパスを指定することはできません。

path('schools_detail/',views.SchoolDetailView.as_view(),name = "detail"),

これにより、以下のエラーが発生します。

ジェネリック詳細ビューSchoolDetailViewは、URLconf内のオブジェクトpkまたはスラッグのいずれかを使用して呼び出す必要があります。

つまり、StudentというテーブルとSchoolという別のテーブルがある場合、ListViewを使用して、以下のようにすべての学校を一覧表示できます。

path('list/',views.SchoolListView.as_view(),name = "list"),

また、学校のアイコンをクリックしたときに個々の学校の学校の詳細を一覧表示する場合は、Djangoが内部で作成した学校の主キーを使用して、それをurlパターンでキャプチャできます。私の場合はurlパターンは「 list / {{school.id}} "したがって、これをキャプチャするには、DetailsViewに対して以下のようなパスを指定する必要があります。

path('list/<int:pk>/',views.SchoolDetailView.as_view(),name = "detail"),

つまり、ほとんどの場合、ListViewを通常のビューとして使用できますが、別のビューにアクセスしたいが、主キーを参照するそのビューの特定の詳細のみにアクセスする場合は、DetailsView(のURLパターンDetailsViewは、URLに主キー情報を指定することで生成されますが、URLに主キーがないと、すべての情報を取得するのではなく、URLの主キーに関連する情報のみを取得するため機能しません)

于 2018-12-16T14:20:17.693 に答える
2

興味深い質問です。残念ながら、答えはそれほど興味深いものではありません。あなたとあなたのアプリにとって最も理にかなっている方です。どちらのアプローチでも同じように議論することができるので、それは実際には単なる判断の呼びかけです。

于 2012-03-19T20:17:58.907 に答える
0

クラスベースのジェネリックビューのユースケースは、次の記事で完全に説明されています。

https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Generic_views

上記の記事では、 ListView / DetailViewをいつ/なぜ、どのように使用するかを簡単な例とともに知ることができます。

于 2018-11-21T09:05:27.333 に答える