Подтвердить что ты не робот

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
4b9b3361

Ответ 1

Как правило, посмотрите параметры в URL. Если вы используете slug для Tag, то, скорее всего, вы имеете дело с DetailView, а не с ListView.

В этом случае второй подход использует меньше кода, и он более изящный. Тем не менее, это также зависит от того, что вы собираетесь делать с просмотром позже. Если вы собираетесь добавлять формы для редактирования сообщений, возможно, имеет смысл использовать ListView. Но нет никаких технических оснований для предпочтения друг друга, просто чтобы вы могли написать больше кода в одном подходе, чем в другом.

Ответ 2

Интересный вопрос. К сожалению, ответ не так уж и интересен: какой из них имеет смысл для вас и вашего приложения. Аргументы могут быть сделаны одинаково для любого подхода, так что это действительно просто вызов.