增加新功能:
但是代码多,可以使用annotate来精简:
使用annotate改进精简:
代码:
from django.db.models import Count
def get_blogs_list_common_data(request, blogs_all_list):
...
# context['blog_types'] = BlogType.objects.all()
# context['blog_types'] = blog_types_list
context['blog_types'] = BlogType.objects.annotate(blog_count=Count('blog'))
...
具体如图:
同样按日期归档的也要显示有多少条数据:
views.py
def get_blogs_list_common_data(request, blogs_all_list):
...
if page_range[-1] != paginator.num_pages:
page_range.append(paginator.num_pages)
# 获取日期归档对应的博客数量
blog_dates = Blog.objects.dates('created_time','month',order='DESC')
blog_dates_dict = {}
for blog_date in blog_dates:
blog_count = Blog.objects.filter(created_time__year=blog_date.year,
created_time__month=blog_date.month).count()
blog_dates_dict[blog_date] = blog_count
...
context['blog_types'] = BlogType.objects.annotate(blog_count=Count('blog'))
# context['blog_dates'] = Blog.objects.dates('created_time', 'month', order="DESC")
context['blog_dates'] = blog_dates_dict
return context
blog\_list.html
...
<div class="panel-heading">日期归档</div>
<div class="panel-body">
<ul>
{# <li>2020年4月</li>#}
{# <li>2020年3月</li>#}
{% for blog_date,blog_count in blog_dates.items %}
<li>
<a href="{% url 'blogs_with_date' blog_date.year blog_date.month %}">
{{ blog_date|date:'Y年m月'}}({{ blog_count }})
</a>
</li>
{% endfor %}
</ul>
</div>
</div>
效果如下:
精简代码像上面annotate方法一样:难以做到,因为存在一个转换成列表并提取的过程,比较复杂,不如原本的方法!所以不做修改!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。