Общие виды Django: когда использовать ListView против DetailView - PullRequest
15 голосов
/ 20 марта 2012

Я использую общие представления 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

Ответы [ 4 ]

9 голосов
/ 20 марта 2012

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

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

1 голос
/ 16 декабря 2018

Технически и ListView, и DetailView не совпадают. Например, вы не можете указать путь для DetailView, как показано ниже в urls.py,

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

Это приведет к ошибке ниже,

Общий подробный вид SchoolDetailView должен вызываться с объектом pk или слагом в URLconf.

Это означает, что если у нас есть таблица с именем 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 в качестве обычного представления для большинства случаев, если вы хотите получить доступ к другому View, но только к определеннойВ этом View, который ссылается на первичный ключ, вы можете использовать DetailsView (шаблон url для DetailsView будет сгенерирован путем предоставления информации первичного ключа в URL, без первичного ключа в URL, который он не будет работать, так как он не будет принимать всевместо этого информация будет принимать только информацию, относящуюся к первичному ключу в URL)

1 голос
/ 20 марта 2012

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

0 голосов
/ 21 ноября 2018

Вариант использования универсальных представлений на основе классов прекрасно описан в статье:

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

В вышеупомянутой статье вы сможете узнать , когда / почему икак использовать ListView / DetailView вместе с простыми примерами.

...