include_tag多用于返回html代码片段(多用于母版构建当中)
首先要在django项目中的app里面新建一个templatetags的文件包(里面放置自定义的tags文件)
然后在自己定义的tags里面要导入template并且注册(register)要实例化一个Library()对象
注册到自己定义的方法上时要加include_tag("对应的html文件")
from django import template
from appbbs import models
from django.db.models import Count
register = template.Library()
@register.inclusion_tag("left_menu.html")
def get_left_menu(username):
user = models.UserInfo.objects.filter(username=username).first()
blog = user.blog # 获取用户的blog
# 查询文章分类及对应的文章数
category_list = models.Category.objects.filter(blog=blog).annotate(c=Count("article")).values("title", "c")
# 查看文章标签及文章数
tag_list = models.Tag.objects.filter(blog=blog).annotate(c=Count("article")).values("title", "c")
# 按日期归档
archive_list = models.Article.objects.filter(user=user).extra(
select={"archive_ym": "date_format(create_time,'%%Y-%%m')"}
).values("archive_ym").annotate(c=Count("nid")).values("archive_ym", "c")
return {
"category_list": category_list,
"tag_list": tag_list,
"archive_list": archive_list
}
自定义的html文件就可以使用传过来的数据了
<div class="panel panel-primary">
<div class="page-header" style="text-align: center;font-size: 20px">文章分类</div>
<div class="panel-body" style="text-align: center;font-size: 18px">
{% for category in category_list %}
<p>{{ category.title }}({{ category.c }})</p>
{% endfor %}
</div>
</div>
<div class="panel panel-warning">
<div class="page-header" style="text-align: center;font-size: 20px">文章标签</div>
<div class="panel-body" style="text-align: center;font-size: 18px">
{% for tag in tag_list %}
<p>{{ tag.title }}({{ tag.c }})</p>
{% endfor %}
</div>
</div>
<div class="panel panel-info">
<div class="page-header" style="text-align: center;font-size: 20px">日期归档</div>
<div class="panel-body" style="text-align: center;font-size: 18px">
{% for archive in archive_list %}
<p>{{ archive.archive_ym }}({{ archive.c }})</p>
{% endfor %}
</div>
</div>
在模板中进行引用
<div class="col-md-3">
{% load my_tag %}<!-- 将自定义的tags标签加载进来 -->
{% get_left_menu username %} <!-- 调用自定义的tag标签并传递参数 -->
</div>