Take the 2-minute tour ×

I am trying to paginate my class-based view. Here is how my view looks:

class IssuesByTitleView(ListView):
    context_object_name = "issue_list"

    def issues(request):
        issue_list = Issue.objects.all()
        ###### Commented out does not work ######
        # paginator = Paginator(issue_list, 24)
        # try:
        #    page = int(request.GET.get('page', '1'))
        # except ValueError:
        #   page = 1
        # try:
        #    issues = paginator.page(page)
        # except (EmptyPage, InvalidPage):
        #    issues = paginator.page(paginator.num_pages)

    def get_queryset(self):
        self.title = get_object_or_404(Title, slug=self.kwargs['title_slug'])
        return Issue.objects.filter(title=self.title).order_by('-number')
    def get_context_data(self, **kwargs):
        context = super(IssuesByTitleView, self).get_context_data(**kwargs)
        context['title'] = self.title
        return context

Here is a sample of my models for some context:

class Title(models.Model):
    ('Ongoing', 'Ongoing'),    
    ('Ongoing - Canceled', 'Ongoing - Canceled'),
    ('Limited Series', 'Limited Series'),
    ('One-shot', 'One-shot'),
    ('Other', 'Other'),
    title = models.CharField(max_length=64)
    vol = models.IntegerField(blank=True, null=True, max_length=3)
    year = models.CharField(blank=True, null=True, max_length=20, help_text="Ex) 1980 - present, 1980 - 1989.")
    category = models.CharField(max_length=30, choices=CATEGORY_CHOICES)    
    is_current = models.BooleanField(help_text="Check if the title is being published where Emma makes regular appearances.")
    slug = models.SlugField()
    class Meta:
        ordering = ['title']
    def get_absolute_url(self):
        return "/titles/%s" % self.slug        
    def __unicode__(self):

class Issue(models.Model):
    title = models.ForeignKey(Title)
    number = models.CharField(max_length=20, help_text="Do not include the '#'.")

Of course, by following the Django docs, the pagination system works when the View is defined by something like this: def view(request):

I'm also wondering how I can pull out the next and previous objects.

I would need a link to the "next issue (with the context of the name and issue number)" and then a "previous issue" link. Please note that simply changing the template link with the next or previous number of the issue is not going to work.

So, if anyone can help me out, that would be great.

share|improve this question
add comment

1 Answer

up vote 11 down vote accepted

Just add paginate_by = 20 to you view class.

class IssuesByTitleView(ListView):
    context_object_name = "issue_list"
    paginate_by = 20

    #More stuff here..
share|improve this answer
This works, but how do I pass it through the template now? For example: Page {{ issue.number }} of {{ issue.paginator.num_pages }}. {% if issue.has_previous %} &laquo; <a href="?page={{issue.previous_page_number }}">Previous</a> {% endif %} {% if issues.has_next %}| <a href="?page={{ issue.next_page_number }}">Next</a> &raquo; {% endif %} doesn't work.. –  AAA May 16 '11 at 15:00
The page_obj context variable will have the info you need. I.e page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}, page_obj.has_previous. There's also the is_paginated context variable to check if there's pagination or not. –  Evan Porter May 16 '11 at 17:00
yeah, that is a key missing detail when answering this question ;) –  defbyte Apr 20 '12 at 17:52
Is it possible to change the paginate_by with a request.GET variable ? –  Natim Sep 25 '12 at 14:08
add comment

Your Answer


