django注册标签的方法

(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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值