【问题标题】:Listing blog entries by year,month按年、月列出博客条目
【发布时间】:2010-12-18 22:37:44
【问题描述】:

我想做这样的事情:

Entries.objects.values('date.year','date.month')

但此行无效。如何按年、月列出博客条目并在模板中显示?

谢谢!

【问题讨论】:

    标签: python django date


    【解决方案1】:

    这是从我的博客中截取的一些代码,我在其中列出了某一年内的所有博客条目:

    Entries.objects.filter(draft=drafts).filter(posted_date__year=year).order_by(order_by)
    

    在上面:

    • drafts 是一个布尔值,用于指定是否显示已完成的项目。
    • year 是选择的年份
    • order_by 是一些排序列名称。

    您应该能够轻松修改此示例以包括月份。 如上所示,可以连续组合多个过滤器。

    【讨论】:

      【解决方案2】:

      如果你设置了

      entry_list = Entry.objects.order_by('pub_date')
      

      在您看来,您可以使用ifchanged 模板标签在模板中显示月份和年份。

      {% for entry in entry_list %}
      {% ifchanged %}<h3>{{entry.pub_date|date:"Y"}}</h3>{% endifchanged %}
      {% ifchanged %}<h4>{{entry.pub_date|date:"F"}}</h4>{% endifchanged %}
      <p>{{entry.title}}</p>
      {% endfor %}
      

      另一个有用的用于博客存档的 Django 查询集方法是 dates

      例如

      entry_months = Entry.objects.dates('pub_date','month','DESC')
      

      返回每个月包含博客条目的 DateQuerySetdatetime.datetime 对象。您可以在模板中使用此查询集来创建指向每月存档页面的链接。

      【讨论】:

        【解决方案3】:

        您可以尝试使用内置的重组标签。

        在你看来:

        archives = Entries.objects.all()
        

        在您的模板中:

        {% regroup archives by date.month as entries_by_month %}
        {% for entries in entries_by_month %}
            <h1>{{ entries.list.0.date|date:"F Y" }}</h1>
            <ul>
            {% for entry in entries.list %}
                <li>{{ entry.title }}</li>
            {% endfor %}
            </ul>
        {% endfor %}
        

        【讨论】:

          【解决方案4】:

          好的,让我们尝试在数据结构中做繁重的工作,而不是模板。

          让我们创建一个实用程序。

          import itertools
          
          def group_by_values(posts, key):
              groups = {}
              for k, g in itertools.groupby(posts, key):
                  if groups.get(k) is not None:
                     groups[k].extend(list(g))
                  else:
                      groups[k] = list(g)
              return groups
          

          让我们在这里使用该实用程序。

          entries = Entry.objects.all().order_by('date')
          yearly_entries = group_by_values(entries, key=lambda x: x.date.year)
          monthly_yearly_entries = {}
          for k, v in yearly_entries.items():
              monthly_yearly_entries[k] = group_by_values(v, key=lambda x: x.date.month)
          return monthly_yearly_entries
          

          结果是很好的字典,其中年和月作为键如下:

          monthly_yearly_entries = {2013: {9: [Entry1, Entry2], 10: [Entry4, Entry5]}}
          

          您可以在模板中很好地展示它

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-14
            • 1970-01-01
            • 1970-01-01
            • 2020-04-13
            • 1970-01-01
            • 2012-02-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多