一、Django实现归档的几种方式
1、简单的实现
视图:
# views.py
def archives(request, year, month):
"""返回点击归档后对应的文章"""
post_list = Post.objects.filter(created_time__year=year,
created_time__month=month
).order_by('-created_time')
return render(request, 'blog/index.html', context={'post_list': post_list})
路由:
# urls.py
url(r'^archives/(?P[0-9]{4})/(?P[0-9]{1,2})/$', views.archives, name='archives'),
自定义标签模板
# templatetags/blog_tags.py
@register.simple_tag
def archives():
"""注册一个自定义标签"""
return Post.objects.dates('created_time', 'month', order='DESC')
# 这里讲一下dates
# 可以根据时间赛选 返回一个去重后的时间的Queryset
在模板中使用
# index.html
<div class="widget widget-archives">
<h3 class="widget-title">归档</h3
{{% archives as date_list %}
<ul>
{% for date in date_list %}
<li>
<a href="/archives/{{ date.year }}/{{ date.month }}">{{ date.year }} 年 {{ date.month }} 月</a>
</li>
{% empty %}
暂无归档!
{% endfor %}
</ul>
</div>
2、使用django自带的regroup标签
regroup标签的相文档:
https://docs.djangoproject.com/en/2.1/ref/templates/builtins/#regroup
视图函数:
# views.py
def archives(request):
"""
文章归档
:param request:
:return:
"""
dates = Blog.objects.all().order_by('-create_time')
data = {
'title': '文章归档',
'dates': dates
}
return render(request, 'blog/archives.html', context=data)
模板:
#html 使用的layui
<h2>文章归档</h2>
<hr class="layui-bg-red">
<ul class="layui-timeline">
{% regroup dates by create_time.year as year_blog_group %}
{% for year in year_blog_group %}
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text year-ul-list">
<h3 class="layui-timeline-title">{{ year.grouper }}年</h3>
<ul class="layui-timeline">
{% regroup year.list by create_time.month as month_blog_group %}
{% for month in month_blog_group %}
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<h3 class="layui-timeline-title">{{ month.grouper }}月</h3>
<ul>
{% for blog in month.list%}
<li>
<a href="{% url 'blog:read_blog' %}?blogid={{ blog.id }}" target="_blank">
{{ blog.create_time|date:'m-d' }} -- {{ blog.title }}</a>
</li>
{% endfor %}
</ul>
</div>
</li>
{% endfor %}
</ul>
</div>
</li>
{% empty %}
<h3 style="color: red;">暂无归档</h3>
{% endfor %}
</ul>
其中样式我使用了layui带的 效果图: