1. 程式人生 > >Django2.0-templates(4)-模版過濾器

Django2.0-templates(4)-模版過濾器

模板常用過濾器

  • 有時候需要對模板中的一些資料進行處理。一般是通過函式的形式來完成,而在DTL中,不支援函式的呼叫形式(),因此不能給函式傳遞引數。可以通過過濾器來實現,過濾器本身實現就是函式。過濾器使用的是|傳參可以只有一個引數(左邊)

:和arg之間不能有空格

{# 常用的add過濾器 #}
{{ value|add:arg }}   
{# 等同於add(value ,arg) #}

add

  • 將傳進來的引數新增到原來的值上面去。這個過濾器會嘗試將paramvalue轉換成為整型然後進行相加。如果轉換整型過程中失敗(丟擲異常),則將paramvalue進行拼接。如果兩者都是字串,那麼就會拼接成字串,如果都是列表,則會拼接為列表。
{{ value|add:arg }}   

如果value是4,arg2,則結果為數字6.如果是字串比如jack,則結果為jack2

原始碼如下:

def add(value, arg):
    # Add the arg to the value.
    try:
        return int(value) + int(arg)
    excpet (ValueError, TypeError):
        try:
            return value + arg
        except Exception:
            return
''
  • 例項程式碼:

    #urls.py
    
    path('add/', views.add_filter)
    
    # views.py
    def add_filter(request):
        context = {
            "value1": [1, 2, 3, "a", [1, 2, 3]],
            "value2": ["aa", "bb", {"param": "value"}]
        }
        return render(request, "add.html", context=context)
    
    <!-- add.html -->
    <!DOCTYPE html>
    <html lang="en"> <head> <meta charset="UTF-8"> <title>過濾器add呼叫</title> </head> <body> <h1> {{ value1 |add:value2 }} </h1> </body> </html>
    • 執行

      add

cut

  • 移除值中所有指定的字串。類似python中的replace(args,"")

:和arg之間不能有空格

{{ value | cut:" " }}
{# 將value中的空格去除 #}

原始碼如下:

def cut(value, arg):
    # Remove all values of arg from the given string
    safe = isinstance(value, SafeData)
    value = value.replace(arg, '')
    if safe and arg != ';':
        return mark_safe(value)
    return value
  • 例項程式碼

    # urls.py
    path('cut/', views.cut_filter)
    
    # views.py
    def cut_filter(request):
        return render(request, "cut.html")
    
    <!-- cut.html-->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>cut過濾器</title>
    </head>
    <body>
        <h2>
            {{ "hello"|cut:"l" }}
        </h2>
    </body>
    </html>
    

date

  • 將一個日期按照指定的格式,格式為字串。

    {{ day|date:"格式字串“ }}
    
  • 時間格式化表:

    格式字元 描述 示例
    Y 四位數字的年份 2019
    m 兩位數字的月份 01-12
    d 兩位數字的天數 01-31
    n 月份,無0字首 1-12
    j 天數,無0字首 1-31
    h 小時,12小時制,有0字首 01-12
    g 小時,12小時制,無0字首 1-12
    H 小時,24小時制,有0字首 01-24
    G 小時,24小時制,無0字首 1-24
    i 分鐘,有0字首 00-59
    s 秒,有0字首 00-59
  • 例項

  # urls.py
  	path('date/', views.date_filter),
# views.py
def date_filter(request):
    context = {
        "day": datetime.now()
    }
    return render(request, "date.html", context=context)
<!-- date.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>date</title>
</head>
<body>
    <h3>
        {{  day|date:"Y/n/j g:i:s" }}
    </h3>
</body>
</html>
  • 執行

    date

default

如果value是一個Flase的值,比如[] {},None,""等在if中被認為是False的值,可以使用default夠氯氣提供的預設值arg

{{ value|default:arg }}

如果valueNoneargno value,則模板顯示為no value

default_if_none

僅僅當valueNone才會使用arg的值

{{ value|default_if_none:args }}

first

返回列表/元組/字串的第一個元素

{{ value|first }}

如果value等於"abc", 模板顯示a

last

返回列表/元組/字串的最後一個元素

{{ value|last }}

如果value等於["a", "b",],模板顯示b

floatformat

四捨五入的方式格式化一個浮點數型別

  • 如果這個過濾器沒有傳遞任何引數

  • 只會保留一個小數

  • 若小數全為0,則只保留整數

  • 如果傳遞引數,則標識具體要保留幾個小數

  • 例項

# urls.py
path('floatformat/', views.floatformat_filter),
# views.py
def floatformat_filter(request):
    context = {
        "value11": 3.123,
        "value12": 3.193,
        "value13": 3.000,

        "value21": 3.1415926,
        "value22": 3.1415926,
        "value23": 3.1415926,
    }

    return render(request, "floatformat.html", context=context)
<!-- floatformat.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>floatformat</title>
</head>
<body>
    <h4>
        {{ value11|floatformat }}
        <br>
        {{ value12|floatformat }}
        <br>
        {{ value13|floatformat }}
        <br>
    </h4>
    <h4>
        {{ value21|floatformat:0 }}
        <br>
        {{ value22|floatformat:1 }}
        <br>
        {{ value23|floatformat:2 }}
        <br>

    </h4>

</body>
</html>
  • 執行

    floatformat

join

類似python的join ,將列表/元組/字串用指定的字元進行拼接

{{ value|join:'+' }}

如果value"abc",則模板輸出為a+b+c

  • 例項

    # urls.py
    path('join/', views.join_filter),
    
    # views.py
    def join_filter(request):
        context = {
            "value": "abc",
        }
    
        return render(request, "join.html", context=context)
    
    <!-- join.html -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>join</title>
    </head>
    <body>
        {{ value|join:'+' }}
    </body>
    </html>
    
  • 執行

    join

length

獲取一個列表/元組/字串/字典的長度。

{{ value|length }}

valueNone,則返回0

lower

將值中所有的字元全部轉換為小寫

{{ value|lower }}

upper

將值中所有的字元轉換為大寫

{ value|upper }

random

在被給的列表/字串/元組中隨機的選擇一個值

{{ value|random }}

safe

標記一個字串是安全的。也就是會關掉這個字串的自動轉義。類似模板標籤中的{% autoescape off %}

{{ value|sage }}

如果value是一個不包含任何特殊字元的字串,會正常輸出字串

如果是一串html程式碼,那麼會safe過濾器就將這串程式碼作為html程式碼輸出

  • 例項

    # urls.py
    path('safe/', views.safe_filter),
    
    # views.py
    
    def safe_filter(request):
        context = {
            "normal": "原樣字串<h1>aaa</h1>",
            "url": "<a href='http://www.baidu.com'>百度</a>",
        }
        return render(request, "safe.html", context=context)
    
    {# safe.html #}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>safe</title>
    </head>
    <body>
        <h4>
            {{ normal|safe }}
            <br>
            {{ url|safe }}
        </h4>
    </body>
    </html>
    
  • 執行

    safe

slice

類似python中的切片操作

{{ a_list|slice:"切片格式" }}

比如a_list[1,2,3,4,],"切片格式"[::-],則模板輸出為[4,3,2,1]

striptags

刪除字串中所有的html標籤。

{{ value|striptags }}

如果value<h1> jack </h1>,那麼模板輸出為jack

truncatechars

如果給定的字串長度超過了過濾器指定的長度。那麼會進行切割,並且拼接三個點來作為省略號

注意三個點也算在指定的長度裡面,算三個字元

{{ value|truncatechar:number }}

truncatechars_html

會忽略字串中的html標籤,其他同truncatechars