【问题标题】:Creating a news archive in Django在 Django 中创建新闻存档
【发布时间】:2010-12-02 08:20:24
【问题描述】:

我希望在 python/django 中构建一个新闻存档,但我不知道从哪里开始。我需要视图来提取我已经完成的所有新闻文章,然后我需要将它们划分为几个月和几年,例如

9 月 9 日 10 月 09 日

然后我需要在每次为新的月份创建新的新闻文章时都需要输出新的月份,所以如果一篇新闻文章是在 11 月撰写的,那么存档将是,

9 月 9 日 10 月 9 日 11 月 9 日

有人帮忙吗?

【问题讨论】:

  • 如果你真的不知道从哪里开始,我建议你先做这个教程,这应该会给你一个很好的起点:docs.djangoproject.com/en/dev/intro/tutorial01/…如果你有一个特定的问题,发布你的代码有帮助。
  • 同意,也许可以向我们展示一些你的模型和你迄今为止尝试过的东西。

标签: python django django-models mysql django-templates


【解决方案1】:

您似乎正在尝试制作一个从数据中提取的单一视图,然后尝试按日期等对它们进行排序。我认为这不是解决此问题的最佳方式。

相反,您可以做一个视图来显示每个月的文章。我不知道你的模型,但类似:

articles = ArticleModel.objects.filter(date__month=month, date__year=year)

您将从您的网址获得的月份和年份,fx archive/2009/9。

如果您想确保只显示包含内容的档案的链接,一个简单的解决方案是获取所有文章并标记包含内容的月份。应该有更好的方法来做到这一点,但如果你把它放在一个中间件中并缓存它,它应该不是问题。

【讨论】:

    【解决方案2】:

    James Bennett 的书Practical Django Projects 是一个很好的起点。除其他事项外,它还指导您开发具有多个基于时间的视图(按月等)的网络博客,这些视图应为您提供良好的应用程序基础。

    【讨论】:

      【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 2014-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多