Django Paginate by Year

时间:2011-12-24 12:26:34

标签: python django pagination django-class-based-views

我能够使用通用视图在我网站的索引页面上预览我的新闻剪辑数据库中的100个最新项目:

DPRM

现在我需要在我网站的单独逻辑部分中对我的数据库进行分页。我需要按年分页。我不关心每年有多少条目,我只想从URL获取年份,从该年份获取数据库项目(即/ newsitems / validyearhere),并通过导航方式将其呈现给用户多年。有一种方法可以在Rails中实现这一点,但我无法在Django中找到方法。

我能否使用当前部署的模型?

from django.db import models

class Article(models.Model):
    headline = models.CharField(max_length=100)
    subhead = models.CharField(max_length=50)
    publication = models.CharField(max_length=30)
    author = models.CharField(max_length=50)
    date = models.DateField()
    website = models.URLField()

    def __unicode__(self):
        return self.headline

除了当前的日期字段之外,我还需要添加冗余的Year数据库字段吗?架构是否需要以任何方式发展以适应这种情况?

如果用户输入没有条目或数据不是一年的年份,我还需要它优雅地失败。

请尽可能简单地解释一下,因为我对Django很新,并且发现学习曲线很陡。

2 个答案:

答案 0 :(得分:7)

使用新的Class Based Views,容易使用YearArchiveView

class ArticleYearArchiveView(YearArchiveView):
    model = Article
    paginate_by = 100
    context_object_name = 'article_list'
    date_field = 'date'
    allow_empty = True

即使当年没有元素

,允许空即显示页面

在您的urls.py中,您需要类似

的内容
url(r'^newsitems/(?P<year>\d+)/$', ArticleYearArchiveView.as_view()),

答案 1 :(得分:1)

是的你的模型很好..为什么不写一个基于类的视图?

class SomeListView(ListView):
    model = Article
    paginate_by = 100
    template_name = "app/template.html"
    context_object_name = "articles" # or use object_list

    def get_queryset(self):
        return Article.objects.order_by('-date')

您可以在get_queryset中添加不同的过滤器,以按年份创建包含结果的列表,在模板中,您可以迭代它们并创建自定义按钮(带年份信息)