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模板语法

     

  • 相关阅读:
    Visual Studio 2010使用Visual Assist X的方法
    SQL Server 2000 评估版 升级到 SQL Server 2000 零售版
    双网卡多网络单主机同时访问
    开发即过程!立此纪念一个IT新名词的诞生
    delphi dxBarManager1 目录遍历 转为RzCheckTree2树
    5320 软件集合
    delphi tree 从一个表复制到另一个表
    DELPHI 排课系统课表
    长沙金思维 出现在GOOGLE的 金思维 相关搜索里啦!!
    如何在DBGrid的每一行前加一个单选框?
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11617261.html
Copyright © 2011-2022 走看看