制作步骤
三步走:
1. 在应用下创建一个名字必须是 templatetags 的文件夹。
2. 在该文件夹下创建任意名字的 .py 文件。 eg:mytag.py
3. 在py文件下必须先写下面代码
from django import template
register = template.Library()
详细文件
mytag.py
from django import template
register = template.Library()
@register.inclusion_tag('left_menu.html')
def left_menu(username):
user = models.UserInfo.objects.first(username=username).first()
blog = user.blog
category_list = models.Category.objects.filter(blog=blog).annotate(count_num=Count('article')).values_list('name', 'count_num', 'pk')
tag_list = models.Tag.objects.filter(blog=blog).annotate(count_num=Count('article')).values_list('name', 'count_num', 'pk')
date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values('month').annotate(count_num=Count('pk')).values('month', 'count_num')
return locals()
left_menu.html
# 将left_menu函数返回的数据渲染到页面
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">文章分类</h3>
</div>
<div class="panel-body">
{% for category in category_list %}
<p><a href="/{{ username }}/category/{{ category.2 }}">{{ category.0 }}</a>({{ category.1}})</p>
{% endfor %}
</div>
</div>
<div class="panel panel-danger">
<div class="panel-heading">
<h3 class="panel-title">文章标签</h3>
</div>
<div class="panel-body">
{% for tag in tag_list %}
<p><a href="/{{ username }}/tag/{{ tag.2 }}">{{ tag.0 }}</a>({{ tag.1 }})</p>
{% endfor %}
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">日期归档</h3>
</div>
<div class="panel-body">
{% for date in date_list %}
<p><a href="/{{ username }}/archive/{{ date.month|date:'Y-m' }}">{{ date.month|date:'Y年m月' }}</a>({{ date.count_num }})</p>
{% endfor %}
</div>
</div>
将left_menu.html加载到需要填充的html页面
{% load mytag %}
{% left_menu username %}