将网页侧边栏制成inclusion_tag

本文详细介绍了如何在Django中创建并使用自定义模板标签`mytag.py`来加载`left_menu.html`,展示用户分类、标签和日期归档等侧边栏信息。通过查询数据库获取用户相关数据,包括分类下的文章数、标签下的文章数以及按月统计的文章数量,并在模板中渲染这些数据,实现了动态侧边栏的构建。
摘要由CSDN通过智能技术生成

制作步骤

三步走:
    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

    # 1.查询当前用户下所有的分类以及分类下的文章数
    category_list = models.Category.objects.filter(blog=blog).annotate(count_num=Count('article')).values_list('name', 'count_num', 'pk')
    # print(category_list) # 列表套元组
    # 2.查询当前用户下所有的标签以及标签下的文章数
    tag_list = models.Tag.objects.filter(blog=blog).annotate(count_num=Count('article')).values_list('name', 'count_num', 'pk')
    # 3.按照年月统计文章
    date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values('month').annotate(count_num=Count('pk')).values('month', 'count_num')
    # print(date_list) # 列表套字典
    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 %}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值