Как сделать пагинацию другой модели в представлении класса?

Есть ли способ пагинации другой модели в представлении на основе класса в django? У меня есть такой код. Я хотел бы вывести на страницу комментарии, возможно ли это?

class ShopDetailView(VisitCounter, DetailView):
    model = Item 
    template_name = 'shop/detail.html'
    context_object_name = 'item'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = Comment.objects.filter(comment_item=self.object)
        context['form'] = CommentCreationForm()
        return context

Вы можете (ab)использовать метод .paginate_queryset(…) [Django-doc] миксина MultipleObjectMixin [Django-doc] для пагинации кверисета Comments:

from django.views.generic.list import MultipleObjectMixin

class ShopDetailView(VisitCounter, DetailView!!!, MultipleObjectsMixin):
    model = Item 
    template_name = 'shop/detail.html'
    context_object_name = 'item'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        paginator, page, comment_queryset, is_paginated = self.paginate_queryset(Comment.objects.filter(comment_item=self.object), 25)
        context.update(
            comments=comment_queryset,
            paginator=paginator,
            page_obj=page,
            is_paginated=is_paginated
        )
        context['form'] = CommentCreationForm()
        return context

Здесь 25 - это количество комментариев, вы можете установить другое значение, если хотите, чтобы страницы содержали меньше или больше элементов на странице.

В шаблоне у вас есть доступ к comments, который является страничным кверисетом, paginator и объекту page, как в страничном ListView, за исключением того, что здесь мы странично отображаем комментарии, а не главную модель Item

Вы можете попробовать код ниже, но при таком подходе вам придется каждый раз обновлять страницу просмотра деталей для просмотра старых комментариев, что не является кодом.

def get_context_data(self, **kwargs):
    comments = Comment.objects.filter(comment_item=self.object)
    paginator = Paginator(comments, self.paginate_by)
    page = self.request.GET.get('page')
    try:
        comments = paginator.page(page)
    except PageNotAnInteger:
        comments = paginator.page(1)
    except EmptyPage:
        comments = paginator.page(paginator.num_pages)
        
    context['comments'] = comments
    return context

Полагаю, вам следует создать отдельное представление для отображения комментариев, применить к нему пагинацию и сделать вызов ajax для обновления раздела комментариев каждый раз, когда пользователь нажимает на следующую страницу.

Вернуться на верх