Django Generic Views: когда использовать ListView и DetailView
Я использую общие представления класса на основе Django в приложении для блогов. В одном из моих представлений отображается список сообщений с определенным тегом. Я могу написать это представление как ListView
сообщений, отфильтрованных по тегу. Или я могу написать это представление как DetailView
тега и добавить соответствующие сообщения в контекст.
Один из способов более правильный - или Pythonic - другой?
Подход ListView
кажется более смысловым, потому что я хочу список сообщений, но он также немного сложнее. Для этого требуется перезаписать два метода. Подход 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
Ответы
Ответ 1
Как правило, посмотрите параметры в URL. Если вы используете slug
для Tag
, то, скорее всего, вы имеете дело с DetailView
, а не с ListView
.
В этом случае второй подход использует меньше кода, и он более изящный. Тем не менее, это также зависит от того, что вы собираетесь делать с просмотром позже. Если вы собираетесь добавлять формы для редактирования сообщений, возможно, имеет смысл использовать ListView
. Но нет никаких технических оснований для предпочтения друг друга, просто чтобы вы могли написать больше кода в одном подходе, чем в другом.
Ответ 2
Интересный вопрос. К сожалению, ответ не так уж и интересен: какой из них имеет смысл для вас и вашего приложения. Аргументы могут быть сделаны одинаково для любого подхода, так что это действительно просто вызов.