在Django中创建新闻档案
我想用Python和Django来建立一个新闻档案,但我不知道从哪里开始。我需要一个视图来提取我所有的新闻文章,然后把它们按月份和年份分类,比如:
09年9月
09年10月
每当有新的新闻文章创建时,这个视图就需要输出新的月份。如果有一篇新闻是在11月写的,那么档案就会变成:
09年9月
09年10月
09年11月
有人能帮忙吗?
3 个回答
0
看起来你想做一个单一的视图,提取所有数据,然后按日期等进行排序。我觉得这样做可能不是最好的方法。
相反,你可以做一个视图,来显示每个月的文章。我不知道你的模型是什么样的,但可以考虑类似这样的方式:
articles = ArticleModel.objects.filter(date__month=month, date__year=year)
月份和年份可以从你的网址中获取,比如说 archive/2009/9。
如果你想确保只显示有内容的归档链接,一个简单的解决办法是获取所有文章,并标记出有内容的月份。虽然应该有更好的方法,但如果把这个放在中间件里并进行缓存,应该就没问题了。
3
你可以尝试一个方法,就是为你的模型创建一个自定义管理器,这样可以方便地提取归档数据。下面是我使用的代码:
from django.db import models, connection
import datetime
class EntryManager(models.Manager):
def get_archives(self, level=0):
query = """
SELECT
YEAR(`date_posted`) AS `year`,
MONTH(`date_posted`) AS `month`,
count(*) AS `num_entries`
FROM
`blog_entry`
WHERE
`date_posted` <= %s
GROUP BY
YEAR(`date_posted`),
MONTH(`date_posted`)
ORDER BY
`year` DESC,
`month` DESC
"""
months = ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')
cursor = connection.cursor()
cursor.execute(query, [datetime.datetime.now()])
return [{'year': row[0], 'month': row[1], 'month_name': months[int(row[1])-1], 'num_entries': row[2]} for row in cursor.fetchall()]
当然,你需要把它和模型关联起来,具体做法是:
objects = EntryManager()
这个方法会返回一个字典列表,里面包含了年份、数字形式的月份、月份名称和条目数量。你可以这样调用它:
archives = Entry.objects.get_archives()
3
一个很好的入门书籍是James Bennett写的《实用Django项目》。这本书不仅仅是介绍基础知识,还会带你一步步开发一个网络博客,里面有多种时间视图(比如按月份查看等),这些内容会对你后续的应用开发非常有帮助。