(1)inclusion_tag()
通过呈现另一个模板来显示某些数据,这种类型的标签称为“包含标签”
eg:
register = template.Library()
@register.inclusion_tag('blog/tags/article_list.html')
def load_article_summary(articles):
'''返回文章列表模板'''
return {'articles': articles}
(2)simple_tag用来提供数据
register = template.Library()
@register.simple_tag
def get_category_list():
'''返回分类列表'''
return Category.objects.annotate(total_num=Count('article')).filter(total_num__gt=0)
#annotate
我们知道从数据库取数据都是使用模型管理器 objects 的方法实现的。比如获取全部分类是:Category.objects.all() ,假设有一个名为 test 的分类,那么获取该分类的方法是:Category.objects.get(name=‘test’) 。objects 除了 all、get 等方法外,还有很多操作数据库的方法,而其中有一个 annotate 方法,该方法正可以帮我们实现本文所关注的统计分类下的文章数量的功能
annotate 方法在底层调用了数据库的数据聚合函数
这个 Category.objects.annotate 方法和 Category.objects.all 有点类似,它会返回数据库中全部 Category 的记录,但同时它还会做一些额外的事情,在这里我们希望它做的额外事情就是去统计返回的 Category 记录的集合中每条记录下的文章数。代码中的 Count 方法为我们做了这个事,它接收一个和 Categoty 相关联的模型参数名(这里是 Post,通过 ForeignKey 关联的),然后它便会统计 Category 记录的集合中每条记录下的与之关联的 Post 记录的行数,也就是文章数,最后把这个值保存到 total-number 属性中。
{% get_category_list as categories %}
<ul class="list-group list-group-flush f-16">
{% for each in categories %}
<li class="list-group-item d-flex justify-content-between align-items-center pr-2 py-2">
<a class="category-item" href="{{ each.get_absolute_url }}"
title="查看【{{ each.name }}】分类下所有文章">{{ each.name }}</a>
<span class="badge text-center" title="当前分类下有{{ each.total_num }}篇文章">{{ each.total_num }}</span>
</li>
{% endfor %}
</ul>