• Django 内置的过滤器与标签、自定义过滤器与标签


    一、过滤器–(内置方法)

    在Django的模板语言中,通过使用 过滤器 来改变变量的显示。

    过滤器: 管道符 左侧当做过滤器的第一个参数 右侧有时候还可以支持再传一个参数(冒号开头)

    过滤器的语法: {{ value|filter_name:参数 }}

    使用管道符"|"来应用过滤器。

    例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。

    注意事项:

    1. 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
    2. 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
    3. 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
    4. |左右没有空格没有空格没有空格

    1.1 常用方法展示

    • 统计长度:{{ l|length }}
    • 自增运算:{{ i|add:123 }}、拼接操作:{{ s|add:'去你妹的' }}
    • 日期转换:{{ ctime }}、{{ ctime|date:'Y-m-d' }}
    • 文件大小:{{ file_size|filesizeformat }}

    将整数类型的数字转换成 KB, MB, GB…

    • 截取字符(三个点也算):{{ desc|truncatechars:6 }}

    将一串字符从头开始截取,识别字符, 但是最后一定为留三个字符的位置存储三个点...

    • 截取单词(三个点不算):{{ desc|truncatewords:3 }}

    将一串字符从头开始截取,识别单词(按照空格识别), 最后会显示三个点...,但是这三个点不会占据位置

    • 切片操作:{{ s|slice:'0:4' }}

    • 默认值(判断布尔值):{{ b|default:'这个东西布尔值是False' }}

    当前面的参数为True时,则结果显示为True;

    当前面的参数为False时,则结果显示为:后面定义的参数这个东西布尔值是False;

    • 取消自动转义: {{ value|safe }}

    Django的模板会对HTML标签、JS等语法标签进行自动转义;

    例如value="<script>alert(123)</script>",模板变量{{ value }}会被渲染成 &lt;script&gt;alert(123)&lt;/script&gt ; 交给浏览器后会被解析成普通字符'<script>alert(123)</script>'失去了js代码的语法意义

    需要将变量{{ value }}变成{{ value|safe }}

    拓展:后端有个模块也可以做到自动转义的功能

    from django.utils.safestring import mark_safe
    
    ht1 = '<h1>一级标题</h1>'
    ht1 = mark_safe(ht1)
    return render(request, 'test.html', {'ht1':ht1})
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在前端就可以直接通过{{ ht1 }}渲染出一级标题的效果,而不是字符串


     

    二、标签–(流程控制)

    2.1 for标签

    在前端模板文件中,只需要输入for然后按table键就能够自动补全

    #1、遍历每一个元素:
    {% for person in person_list %}
        <p>{{ person.name }}</p>
    {% endfor %}
    
    #2、反向循环
    {% for obj in list reversed %}
    
    #3、遍历一个字典:
    {% for key,val in dic.items %}
        <p>{{ key }}:{{ val }}</p>
    {% endfor %}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    forloop 参数

    forloop参数其实就是一个字典,字典中有以下参数:

    forloop.counter 当前循环的索引值(从1开始)
    forloop.counter0 当前循环的索引值(从0开始)
    forloop.revcounter 当前循环的倒序索引值(从1开始)
    forloop.revcounter0 当前循环的倒序索引值(从0开始)
    forloop.first 当前循环是第一次循环则返回True,否则返回False
    forloop.last 当前循环是最后一次循环则返回True,否则返回False
    forloop.parentloop 本层循环的外层循环

    empty 参数

    for标签可以带有一个可选的{% empty %} 从句,在变量person_list为空或者没有被找到时,则执行empty子句

    {% for person in person_list %}
        <p>{{ person.name }}</p>
    
    {% empty %}
        <p>sorry,no person here</p>
    {% endfor %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

     

    2.2 常用标签之if标签

    {% if 条件 %}条件为真时if的子句才会生效,条件也可以是一个变量,if会对变量进行求值,在变量值为空、或者视图没有为其传值的情况下均为False

    if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

    {% if num > 100 or num < 0 %}
        <p>无效</p>
    {% elif num > 80 and num < 100 %}
        <p>优秀</p>
    {% else %}
        <p>凑活吧</p>
    {% endif %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

     

    2.3 常用标签之with标签

    with标签用来为一个复杂的变量名起别名,如果变量的值来自于数据库,在起别名后只需要使用别名即可,无需每次都向数据库发送请求来重新获取变量的值

    注意:起别名的变量不能在别的语句中使用!!!

    {% with li.1.upper as v %}
        {{ v }}
    {% endwith %}
    
    • 1
    • 2
    • 3

     

    三、自定义过滤器、标签

    当内置的过滤器或标签无法满足我们需求时,我们可以自定义,具体操作步骤如下

    1、在settings.py中的INSTALLED_APPS添加当前app的名字,不然django无法找到自定义的过滤器或标签

    # 在settings.py中找到该列表,然后加以配置
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',
        'app01', # 添加当前app的名字
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2、在文件夹app01中创建子文件夹templatetags(文件夹名只能是templatetags)

    3、在templatetags新建任意.py文件,如my_tags.py,在该文件中自定义过滤器或标签,文件内容如下

    from django import template
    register = template.Library() # 注意变量名必须为register,不可改变
    
    • 1
    • 2
    #1、自定义过滤器
    @register.filter
    def my_multi_filter(v1 ,v2): # 自定义的过滤器只能定义最多两个参数,针对{{ value1 | filter_multi:value2 }},参数传递为v1=value1,v2=value2
        return  v1 * v2
    
    #2、自定义标签
    @register.simple_tag
    def my_multi_tag(v1, v2): # 自定义的标签可以定义多个参数
        return v1 * v2
    
    
    #3、自定义标签扩展之mark_safe
    # 注释:我们可以用内置的标签safe来让标签内容有语法意义,如果我们想让自定义标签处理的结果也有语法意义,则不能使用内置标签safe了,需要使用mark_safe,可以实现与内置标签safe同样的功能
    from django.utils.safestring import mark_safe
    
    @register.simple_tag
    def my_input_tag(id, name):
        res = "<input type='text' id='%s' name='%s' />" % (id, name)
        return mark_safe(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4、自定义过滤器或标签必须重新启动django方可生效

    5、自定义过滤器或标签的使用

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <!--必须先加载存有自定义过滤器和标签的文件-->
    {% load my_tags %}
    
    <!--salary的值为10,经过滤器my_multi_filter的处理结果为120-->
    {{ salary|my_multi_filter:12 }}
    
    <!--结果为2-->
    {% my_multi_tag 1 2 %}
    
    <!--
    结果为一个input标签,该表的属性id="inp1" name="username"
    注意:input的属性值均为字符串类型,所以my_input_tag后的两个值均为字符串类型
    -->
    {% my_input_tag "inp1" "username" %} 
    
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

     

  • 相关阅读:
    Elasticsearch8 - Docker安装Elasticsearch8.12.2
    数据分析和互联网医院小程序:提高医疗决策的准确性和效率
    电脑重装系统后Win11底部任务栏大小调整方法
    光阑,像差和成像光学仪器
    kickstarter众筹运营分享
    JVM之强软弱虚引用
    web 面试高频考点 —— JavaScript 篇(一)【JS的三座大山 】 变量类型和计算、原型和原型链、作用域和闭包、异步
    深入解析spring boot配置加载原理,配置文件的加载顺序是怎么实现的?
    【C++ string简单】就不告诉你(倒置输出结果)
    MySQL简介
  • 原文地址:https://blog.csdn.net/weixin_43988680/article/details/125449788