Paginate Class-based View in Django

I am trying to break pages into a class. Here's what my look looks like:

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 an example of my models for some context:

 class Title(models.Model): CATEGORY_CHOICES = ( ('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, following the Django docs, the pagination system works when the view is defined as follows: def view(request):

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

I need a link to “next issue (with context of name and release number)” and then a link to “previous issue”. Please note that simply changing the template link with the next or previous problem number will not work.

So, if anyone can help me, it will be great.

+6
source share
2 answers

Just add paginate_by = 20 to view the class.

 class IssuesByTitleView(ListView): context_object_name = "issue_list" paginate_by = 20 #More stuff here.. 
+15
source

As Evan Porter commented, you can use the page_obj context variable to access number, paginatior.num_pages, has_next, has_previous . It just saved me from KeyError['page'] after upgrading from Django 1.4.1 to 1.7, object_list to ListView

+1
source

Source: https://habr.com/ru/post/888214/


All Articles