美文网首页Django学习玩耍Python代码改变世界
Django Blog 文章按发表时间自动归档的优雅解决方案

Django Blog 文章按发表时间自动归档的优雅解决方案

作者: 追梦人物 | 来源:发表于2016-07-31 12:30 被阅读1702次

    Django Blog 文章按发表时间自动归档的优雅解决方案

    Blog 应用通常都有一个文章归档的功能,按照年月来对所有文章分组,比较优雅的显示可能是这样的:

    • 2016 年
      • 8 月
      • 4月
      • 3月
    • 2015 年
      • 9月
      • 8月
      • 1月
    • 2013 年
      • 7月
      • 6月
      • 5月

    Django 为上述的需求提供了非常优雅的解决方案。

    假设我们有如下的 Model :

    models.py
    
    class Post(models.Model):
        """
        Blog 的文章模型
        """
        title = models.CharField(max_length=255)
        body = models.TextField()
        pub_date = models.DateTimeField()
    
        def __str__(self):
            return self.title
    

    其中 pub_date 是文章发表时间。首先我们取得所有已发表文章的发表时间(pub_date,精确到月份):

    views.py
    
    def archive(request):
        # datetimes() 方法返回一个 python 的 datetimes 对象列表
        # 对应着每篇文章的发表时间
        # month 表示精确到月份,DESC 表示降序排列
        dates = Post.objects.datetimes('pub_date', 'month', order='DESC')
        return render(request,'archive.html',{'dates':dates})
    

    例如你可能得到如下的 datetimes 对象列表:

    2016 08

    2016 04

    2016 03

    2015 09

    2015 08

    2015 01

    2013 07

    2013 06

    2013 05

    已经按照先年份后月份降序排列,现在需要做的就是按照年份分组即可,Django 为我们提供了 {% regroup %} 模板标签,在模板中使用它:

    archive.html
    
    <p>归档</p>
    <!-- 归档 -->
    <!--
    regroup 对 dates 按照 year(年份) 分组,把相同年份的月分到一个组
    -->
    {% regroup dates by year as dates_by_year %}
    <ul>
        {% for mouth in dates_by_year %}
        <!-- month 是一组月份列表 -->
            <li>
                {{ mouth.grouper }} 年
                <!-- grouper 是组头,即某个月份列表的年份 -->
                <ul>
                    {% for d in mouth.list %}
                    <!-- 再循环显示该年份组下的月份列表即可 -->
                        <li>
                            {{ d |date:'m' }} 月
                        </li>
                    {% endfor %}
                </ul>
            </li>
        {% endfor %}
    </ul>
    

    测试效果如图:

    归档效果演示图

    由此实现了按照文章发表时间自动归档,通过 datetimes() 方法的参数还可以控制归档的精度,比如日、时、分等,简洁而优雅。归档的样式则可以通过 css 自由定制。

    相关文章

      网友评论

      • 地表最强程序员小白:想请问怎么获取分档的文章数,因为感觉和获取分类标签的文章数不一样:sob:
      • 蒋龙_91c9:这里有没有什么好的方法在获得归档日期的同时获得记录条数,例如2017-08(11条)
        地表最强程序员小白:我也想问这个问题
      • 6012ef11dfd9:楼主,你好,请教一下,如果我想实现按照发表日期,显示日期对应的所有文章,如下:

        2016年8月1日
        文章1_titile
        文章2_title
        文章3_titile

        2016年8月2日
        文章1_titile
        文章2_title
        文章3_titile


        求指点,谢谢;)
        追梦人物:你先看一下 django 内置模板标签的 groupby 方法,基本思路就是按照发表时间分组。如果还是没有思路的话在 http://yangxg.top发帖 或者 简书联系我,我再回复你。
      • 屁啊ok:hi,按照这个教程搞定了 ,请教一下思路,点击每个月份就能显示该月发表的文章这个怎么实现
        屁啊ok:@追梦人物 so thinks a lot
        追梦人物:@屁啊ok 这里看看django 的 class based view 里的 dateview
      • 屁啊ok:楼主 怎么样可以让archive.html的归档内容在每个页面的右侧显示
        屁啊ok:@追梦人物 是这个意思 就像WordPress那样 右侧有归档列表
        追梦人物:@屁啊ok 浮动?
        屁啊ok:@屁啊ok 求教
      • 顾慎为:文中好几处误写成mouth:sweat::sweat::sweat:
      • jetson:谢谢分享,好久没看到你冒泡了,还以为弃坑了
        追梦人物:@jetson 哈哈,自己还在学习,只是投入的时间少了些,所以没出教程了。

      本文标题:Django Blog 文章按发表时间自动归档的优雅解决方案

      本文链接:https://www.haomeiwen.com/subject/hsntsttx.html