素材牛VIP会员
Django blog 实现文章自动归档有什么优雅的方法么?
 日***天  分类:Python  人气:860  回帖:2  发布于6年前 收藏

最近在用 Django 做一个个人 Blog,想实现一个文章归档功能,效果像这样:

就是首页递减显示文章发表年份,点击该年份展开显示该年下的月份。

我目前的实现思路是这样的:

首先获取全部文章的发表时间(精确到月,已去重):

date_list = Article.objects.datetimes('created_time', 'month')

然后把时间列表放到一个字典里,键是年份,值为月份列表:

date_dict = defaultdict(list)
        for d in date_list:
            print(type(d.year))
            print(type(d.month))
            date_dict[d.year].append(d.month)
        return dict(date_dict)  # 模板不支持defaultdict

在模板中循环出来:

{% for year,month_list in d.items %}
    <p>{{year}}<p>
    {% for month in month_list  %}
        <p>{{month}}<p>

能够实现部分需求,但是总觉得不优雅,其次是由于字典是无序的,可能导致显示的并非按照时间递减排序,如果要保持有序可能还得将字典改成二重列表,感觉更不优雅了。

有什么更加优雅一些的实现方法么?或者一些比较好的实践方法介绍。

讨论这个帖子(2)垃圾回帖将一律封号处理……

Lv5 码农
sh***ao 职业无 6年前#1

谢谢大家,目前已完美解决。django对这类问题早有解决方案。模板标签有regroup,专为解决该问题而生。字典排序也有oderdict模板过滤器。

Lv6 码匠
生***炸 UI设计师 6年前#2

想让字典有序可用 OrderedDict


其实连 OrderedDict 也不用,直接对键排序就好了,用原生 MultiValueDict 会更优雅


来一发完整版的

from django.utils.datastructures import MultiValueDict

dct = MultiValueDict()

for obj in data_list:
    dct.appendlist(obj.year, obj.month)

tuples = sorted((key, sorted(dct.getlist(key))) for key in dct)
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取