Как сделать пагинацию другой модели в представлении класса?
Есть ли способ пагинации другой модели в представлении на основе класса в 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] для пагинации кверисета Comment
s:
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 для обновления раздела комментариев каждый раз, когда пользователь нажимает на следующую страницу.