django模板层

模板语法传值

1.精准传值
    return render(request, '01.html', {'a': name, 'b': age})
    这种传值方式不浪费资源但是针对名字比较多的情况下比较麻烦
    
2.统一传值
    return render(request, '01.html', locals())
    可以将当前函数名称空间中的所有名字都传过去,但是在名字过多又不使用的情况下就比较浪费资源
    
补充:
    1.{{}}:主要与数据值相关
    2.{%%}:主要与逻辑相关
    3.针对需要加括号调用的名字 django模板语法会自动加括号调用你只需要写名字就行
    4.模板语法的注释前端浏览器是无法查看的  # {##}

模板语法传值特性

1.基本数据类型正常展示
2.文件对象也可以展示并调用方法
3.函数名会自动加括号执行并将返回值展示到页面上(不支持传参,只能无参函数)
4.类名也可以自动加括号调用,对象不会(默认情况下对象不能加括号调用)
针对可以自动加括号调用的模板语法都会自动加括号调用

模板语法之过滤器(内置函数)

1.default  默认值
    {{ value|default:"nothing"}}  # 如果value没有传值或值为空则显示nothing
2. length  返回值的长度,用于字符串和列表
3.filesizeformat  将数字格式化为文件大小
4.slice  切片
5.date  格式化时间
    {{ value|date:"Y-m-d H:i:s"}}
6.safe  
    value = "<a href='#'>点我</a>"
    {{ value|safe}}  # 默认情况下不识别html标签和js语法,加上safe后才能识别
    
更多内置函数参考https://www.cnblogs.com/Dominic-Ji/articles/10982302.html

模板层之标签

1.if条件语句
    {% if 条件1 %}
        <p>条件1成立执行</p>
    {% elif 条件2 %}
        <p>条件2成立执行</p>
    {% else %}
        <p>条件都不成立执行</p>
    {% endif %}  # 模板语法中if的结束语句
    
2.for循环
    b = [1, 2, 3, 4, 5]
    {% for i in b %}
        <p>{{ i }}</p>
    {% endfor %}
    我们可以将p标签中的i替换为forloop来查看具体的执行步骤见图一
    
3.取值操作
    django模板语法中的取值操作只用句点符来操作,无论是按键取值还是索引取值都是用句点符操作的
    a = {'name': 'jason', 'age': 18}
    b = [1, 2, 3, 4, 5]
    {{a.name}}  # 取键name的值
    {{b.2}}  # 取索引为2的数据
    
    复杂数据获取之后需要反复使用的可以做一个取别名的操作
    {% with a.name as f %}
    # 取别名的操作只能在当前标签下使用

图一

image

自定义过滤器、标签、inclusion_tag

如果想要自定义模板语法需要先完成下面三步操作
    1.在应用下创建一个名字为templatetags的目录
    2.在templatetags目录下创建任意名称的py文件
    3.在创建的py文件中先编写两行固定代码
        from django import template
        register = template.Library()
这三部操作完成以后就可以在该文件下编写自定义模板语法了
     
1.自定义过滤器(最大只能接收两个参数)
    @register.filter(name='myadd')
    def func1(a, b):
        return a + b
    html页面使用时需要先加载自定义过滤器
        {% load 自定义的py文件名%}
    过滤器加载完以后就可以使用了
        {% i|myadd:1 %}  # i为传的值
        
2.自定义标签(参数没有限制)
    @register.simple_tag(name='mytag')
    def func2(a, b, c, d):
        return f'{a}-{b}-{c}-{d}'  
    {% load 自定义的py文件名 %}
    {% mytag '1' '2' '3' '4' %}  # 传值后会按照自定义的样式排列
    
3.自定义inclusion_tag(局部的html代码)
    @register.inclusion_tag('label.html', name='mymenu')
    def func3(n):
        html = []
        for i in range(n):
            html.addend('<li>第%s页</li>'%i)
        return locals()
    {% load 自定义的py文件名 %}
    {% mymenu 10 %}  # 会在浏览器页面上显示从0到9的页码数

模板的继承与导入

1.模板的继承
    当我们有多个页面有很多相似或相同地方时,可以复制粘贴,也可以使用模板继承
    模板继承使用方法
        1.在模板中使用block划定子版以后可以修改的区域
            {% block 区域名称 %}
            {% endblock %}
        2.子版继承模板
            {% extends '模板文件' %}
            {% block 区域名称 %}
                子版自己的东西
            {% endblock %}
    子版也可以继续使用模板的内容
        {{ block.super }}
    模板中至少应该有三个区域
        页面内容区、css样式区、js代码区
        
2.模板的导入
    我们将某个html页面的部分提前写好,之后其它html页面都可以使用
        {% include '提前写好的部分的文件名(带后缀)' %}
posted on 2023-04-08 20:40  zyg111  阅读(17)  评论(0编辑  收藏  举报