Skip to content

Instantly share code, notes, and snippets.

@nspo
Last active January 15, 2021 14:57
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nspo/5ab1ecde7e918a5fa266298ca5b15f08 to your computer and use it in GitHub Desktop.
Save nspo/5ab1ecde7e918a5fa266298ca5b15f08 to your computer and use it in GitHub Desktop.
Django DetailView with pagination for related objects
# A DetailView of a User can have a paginated list of Purchases
# In the template, the pagination needs to done similar to the following example:
# {% bootstrap_pagination purchases_page_obj extra=request.GET.urlencode parameter_name="purchases_page" %}
from django.views.generic.detail import DetailView
from django.core import paginator
@method_decorator(staff_member_required(login_url='user_login'), name='dispatch')
class UserDetailView(DetailView):
model = User
template_name = "barsys/userarea/user_detail.html"
purchases_paginate_by = 5
def get_context_data(self, **kwargs):
context = super(UserDetailView, self).get_context_data(**kwargs)
purchases_page = self.request.GET.get("purchases_page")
purchases = self.object.get_purchases().filter()
purchases_paginator = paginator.Paginator(purchases, self.purchases_paginate_by)
# Catch invalid page numbers
try:
purchases_page_obj = purchases_paginator.page(purchases_page)
except (paginator.PageNotAnInteger, paginator.EmptyPage):
purchases_page_obj = purchases_paginator.page(1)
context["purchases_page_obj"] = purchases_page_obj
return context
@moustaphacheikh
Copy link

MultipleObjectMixin

Hello, Thanks for sharing your code.
You can do this with less code using MultipleObjectMixin.
In the template (user_detail.html) you can access object_list and use pagination as you would in a ListView. In fact ListView uses MultipleObjectMixin.

from django.views.generic.detail import DetailView
from django.views.generic.list import MultipleObjectMixin

@method_decorator(staff_member_required(login_url='user_login'), name='dispatch')
class UserDetailView(DetailView,MultipleObjectMixin):
    model = User
    template_name = "barsys/userarea/user_detail.html"
    paginate_by = 5

    def get_context_data(self, **kwargs):
        object_list = self.object.get_purchases().filter()
        context = super(UserDetailView, self).get_context_data(object_list=object_list, **kwargs)
        return context

@vsonawala-guidance
Copy link

How can I get next/prev link with this solution?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment