Django 按年份分页
我在我网站的首页上成功预览了新闻剪辑数据库中最近的100条记录,使用的是一个通用的视图:
现在我需要在网站的一个单独部分对我的数据库进行分页。我想按年份分页。每年的条目数量我并不在意,我只想从网址中获取年份,然后从那个年份的数据库中提取数据(比如说 /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
我是否需要在现有的日期字段之外,额外添加一个冗余的年份数据库字段?这个结构需要做什么改变来适应这个需求吗?
如果用户输入了没有条目的年份或者输入了不是年份的数据,我也希望系统能优雅地处理这种情况。
请尽量简单地解释这些,因为我对Django非常陌生,觉得学习起来有点困难。
2 个回答
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里加一个不同的过滤条件,这样就能按年份创建一个结果列表。在你的模板里,你可以遍历这些结果,制作带有年份信息的自定义按钮。
7
使用新的基于类的视图,最简单的方法就是使用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()),