【问题标题】:Paginate Class-based View in Django在 Django 中为基于类的视图分页
【发布时间】:2011-05-16 11:59:00
【问题描述】:

我正在尝试对基于类的视图进行分页。这是我的视图:

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

以下是我在某些情况下的模型示例:

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 '#'.")
    ...

当然,按照 Django 文档,分页系统在 View 由以下内容定义时工作:def view(request):

我也想知道如何取出下一个和上一个对象。

我需要一个指向“下一个问题(带有名称和问题编号的上下文)”的链接,然后是一个“上一个问题”链接。请注意,仅将模板链接更改为问题的下一个或上一个编号是行不通的。

所以,如果有人可以帮助我,那就太好了。

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    只需将paginate_by = 20 添加到您的视图类。

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

    【讨论】:

    • 这可行,但我现在如何通过模板传递它?例如:Page {{ issue.number }} of {{ issue.paginator.num_pages }}. {% if issue.has_previous %} « <a href="?page={{issue.previous_page_number }}">Previous</a> {% endif %} {% if issues.has_next %}| <a href="?page={{ issue.next_page_number }}">Next</a> » {% endif %} 不起作用..
    • page_obj 上下文变量将包含您需要的信息。即page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}page_obj.has_previous。还有 is_paginated 上下文变量来检查是否有分页。
    • 是的,这是回答这个问题时缺少的关键细节;)
    • 是否可以使用 request.GET 变量更改 paginate_by ?
    • @Natim 您可以定义一个 get_paginate_by 函数来返回自定义页面大小。
    【解决方案2】:

    就像 Evan Porter 评论的那样,您可以使用page_obj 上下文变量来访问number, paginatior.num_pages, has_next, has_previous。这就是我从 Django 1.4.1 升级到 1.7 后从 KeyError['page'] 中拯救出来的原因,object_list to ListView

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 2014-10-12
      • 1970-01-01
      • 2019-09-24
      • 2016-03-20
      • 2018-05-14
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多