zoukankan      html  css  js  c++  java
  • Django模板系统-内置和自定义Filters

    django模板中最常用的两种特殊符号是 {{ }} 用来表示变量和 {% %} 用来表示逻辑相关的操作

    变量

     {{ 变量名 }} ,由字母数字下划线组成而.在模板语言中有特殊含义,用来获取对象相应的属性值

    【举例】

    在view中进行定义

     def jjzz(request):
        l = [1,2,3]
        d = {"name":"jjzz"}
     ​
        class Hero(object):
            def __init__(self,name,age):
                self.name = name
                self.age = age
     ​
            def attack(self):
                return f"{self.name} is attacking ..."
     ​
        gailun = Hero(name='gailun',age=23)
        zhaoxin = Hero(name='zhaoxin',age=24)
        nvjing  = Hero(name="kaiselin",age=22)
     ​
        hero_list = [gailun,zhaoxin,nvjing]
     ​
        return render(request,"jjzz.html",{"l":l,"d":d,"hero_list":hero_list})中HTML支持的写法

    HTML中的基础用法

     <body>
     ​
     {# 获取列表l中的元素 #}
     <p>第一个元素:{{ l.0 }}</p>
     <p>第三个元素:{{ l.2 }}</p>
     ​
     {# 获取字典d中的key #}
     <p>获取d中的name:{{ d.name }}</p>
     ​
     {# 获取Hero对象的name属性 #}
     <p>{{ hero_list.0.name }}</p>
     ​
     {# 使用 . 只能调用不带参数的方法#}
     <p>{{ hero_list.1.attack }}</p>
     ​
     </body>

    【注意】

    当模板系统遇到.时,会按照如下的顺序去查询:

    1. 在字典中查询

    2. 属性或者方法

    3. 数字索引

    内置Filters

    过滤器,用来修饰变量的显示结果

    语法 {{ 变量名|过滤器名:参数 }}  注意两边不能有空格,过滤器与给过滤器的参数是一个整体,而且过滤器只能有一个参数

    default

    定义变量的默认值,在没有传递变量或者参数没有定义(不存在或者为空)时,使用默认值

    {{ value|default_name:"nothing"}}  # 如果value值没有没传的话就显示nothing
     ​
     源码解释:
     @register.filter(is_safe=False)
     def default(value, arg):
        """If value is unavailable, use given default."""
        return value or arg

    【注意】在settings中的TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用,优先级高于直接设置default。

    default_if_none

    使用形式: {{ value | default_if_none:"nothing" }} ,

    意义:如果value是None,那么输出将是nothing.

    源码解释

     @register.filter(is_safe=False)
     def default_if_none(value, arg):
        """If value is None, use given default."""
        if value is None:
            return arg
        return value

    【与default的区别】

    None:不存在即为空,'',None

    unavailable:None,False,[],{},''等都可以算是不可用

    符号defaul:"noting"default_if_none:"noting"
    {} noting {}
    "" noting noting
    None noting noting
    [] noting []
    False noting False
    filesizeformat

    将值转换成便于用户可读的方式 。例如:1.1KB,1.1MB,1.1GB

     {{ value|filesizeformat }}   # 比如变量value的值为100000,显示为97.7 KB
    add

    给变量加参数

     {{ value|add:"2" }}  # value是数字4,则输出结果为6。
     {{ l1|add:l2 }}  # 如果l1是 [1,2,3] ,l2是 [4,5,6] ,那输出结果是 [1,2,3,4,5,6]
    lower
     {{ value|lower }}  # 变小写,还能给布尔值变大小写呢
    upper
     {{ value|upper}}  # 变大写
     
    title
     {{ value|title }}  # 单词首字母大写
    ljust
     "{{ value|ljust:"10" }}"  # 左对齐
    rjust
     "{{ value|rjust:"10" }}"  # 右对齐
    center
     "{{ value|center:"15" }}"  # 居中
    length
     {{ value|length }}  # 返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4
    slice
     {{value|slice:"2:-1"}}  # 切片
    first
     {{ value|first }}  # 取第一个元素
    last
     {{ value|last }}  # 去最后一个元素
    join
     {{ value|join:" // " }}  # 使用字符串拼接列表,功能等同于python中的str.join(list)
    truncatechars

    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

    参数:截断的字符数,

     {{ value|truncatechars:9}}  # 截断9个字符
    truncatewords

    将字符串转换为省略表达方式,以空格计数单词

     {{ value|truncatewords:9}}  # 阶段9个单词
    date
     {{ value|date:"Y-m-d H:i:s"}}  # 日期格式化

    可格式化输出的字符

    也可以在settings中进行日期格式的定义

     USE_L10N = False
     ​
     DATETIME_FORMAT = 'Y-m-d H:i:s'
     DATE_FORMAT = 'Y-m-d'
     TIME_FORMAT = 'H:i:s'
    字典拆包
     {{  dic.key  }}
     ​
     {{  dic.keys  }}
     ​
     {{  dic.values  }}
     ​
     {{  dic.items}}
     ​
     【注意】Django的模板语言中属性的优先级大于方法
     例如dic = {"name":"jjzz", "items": "100"}
     ​
     在模板中执行{{ dic.items }}
     ​
     显示100 ​
    safe

    通常情况下,django模板会对HTML标签和JS语法进行自动转义,就是将包含的html标签输出,而不被解释执行,原因是当显示用户提交字符串时,可能包含一些攻击性的代码,如js脚本。例如<会转换为&lt,但是有些时候我们不希望这些元素被HTML转义,那么这是就需要safe过滤器来告诉django这段代码是安全的,不需要转义。

     {{ value|safe}}

    【举例】

    views中设置

     link = '<a href="https://cn.bing.com">这是bing搜索</a>'
     return(request,"jjzz.html",{"link":link})

    HTML模板中设置

     <p>{{ link }}</p>
     <p>{{ link|safe }}</p>

    显示

    safe

    还可以在views中在向模板传递数据前使用mark_safe来进行防转义设置

     from django.utils.safestring import mark_safe
     ​
     a_link= mark_safe('<a href="http://www.baidu.com">跳转</a>')
    

    自定义Filter

    自定义的过滤器知识带一个或者两个参数的python函数

    定义

    1. 在app下创建一个名为templatetags的python包,确保该app已经在settings.py中INSTALLED_APPS注册了。

    2. 在包内创建py文件 — > 自定义 jjzz.py

    3. 在py文件中写入:

       from django import template
       register = template.Library()  # register不能变
    4. 定义函数 + 加装饰

       from django.utils.safestring import mark_safe
       ​
       @register.filter
       def new_safe(value, arg=None):  # arg 最多有一个
           return mark_safe(value)

    在模板中使用:

     {% load jjzz %}
     {{ '<a href="https://cn.bing.com">这是bing搜索</a>'|new_safe }}

    Template模板语法

     

  • 相关阅读:
    Javascript引擎的单线程机制和setTimeout执行原理阐述
    给定红包个数和红包金额,计算红包的金额
    oracle日志归档空间清理
    Jmeter之录制控制器与代理的使用
    Jmeter分布式测试的坑
    Jmeter之Cookie和Session处理
    性能测试之JMeter远程模式
    JMeter自带工具录制配置方法
    Jmeter分布式测试
    性能测试的 Check List (不断更新中)
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11617261.html
Copyright © 2011-2022 走看看