Django模板語言-2:simple_tag和filter

標籤simple_tag:

    標籤:在HTML中使用{% %}標記

    常見的系統內自帶的標籤:load、for 、if、with、csrf_token、verbatim、

    block-endblock\extends\comment-endcomment\cycle(silent)\自定義標籤


    1、with:

        在html裏給變量賦值

{% with name=obj.group.name%}        # 用於長變量賦值
{{name}}                           # 直接調ip,顯示host.name.ip的值

    2、csrf_token:

        之前在使用form表單時,提示Forbidden:CSRF verification failed. Request aborted,

        解決方法1、在settings裏註釋掉中間件CSRF

        解決方法2、在form表單裏添加csrf_token標籤

<form action="checkuser/" method="post">
<input type="text" name="username" placeholder="用戶名" />
<input type="text" name="password" placeholder="密碼" />
<input type="submit" value="登 陸" />

{% csrf_token %} {#使用此句,無需註釋掉中間件的CSRF#}       
</form>


    3、verbatim

        取消渲染模板標記,以文字顯示verbatim裏面的內容

{% verbatim %}
    {{ for i in [1,2,3,4] }}
    {{ i }}
    {{ endfor }}
{% endverbatim %}

網頁顯示結果:
 {{ for i in [1,2,3,4] }} {{ i }} {{ endfor }}

    4、autoescape、識別、不識別含有html標籤的字符串,默認不識別html標籤,與過濾器safe,django的mark_safe作用一樣    

            參數:on、off,默認on

html_str = "<a href='f-t'>點我</a>"
{% autoescape off %}
    {{ html_str }}
{% endautoescape %}

# 結果:
點我

{% autoescape off %}
    {{ html_str }}
{% endautoescape %}

# 結果:
<a href='f-t'>點我</a>

    5、comment註釋

{% comment %}
    此段內容不顯示在網頁上
{% endcomment %}

    6、cycle,循環迭代,重複1到4,遇到resetcycle,重新從1開始,silent使用上一個值

{% cycle '1' '2' '3' '4' as num%}
{% cycle num %}
{% cycle num silent %}        # 重複輸出2
{% resetcycle %}
{% cycle num %}
{% cycle num %}
{% cycle num %}
{% cycle num %}

# 應用場景:隔行變色
{% for i in list%}
<tr class={% cycle 'blue' 'red' %}>lala</tr>
{%endfor%}

    7、debug輸入調試信息

{% debug %}

    8、firstof    輸入參數中,第一個不爲空或false的參數

{% firstof  da  'e' 'f' %}
# 因爲da是未定義的變量名,結果: 'e'



    9、自定義simple_tag:

        3固定原則:在APP中新建包名是固定:templatetags

                           在views中,Library實例化名字固定:register=template.Library()

                           自定義函數,使用register.simple_tag裝飾

        使用:在HTML上方{% load 定義的python文件%}

# 在templatetags下新建python文件,custom_tag.py

# 導入template
from django import template

# 實例化
register = template.Library()        # register固定,不可變爲其它名

@register.simple_tag                 # 裝飾daxie
def daxie(str1):
    # 把字符串變成大寫。
    str1 = str(str1).upper()    
    return str1
# 在HTML中上方載入自定義的python文件

{% load custom_tag %}
{% daxie 'WERWERFSEFkjdDFGSdfeflnnidhggindSDGSEGSFVBNHR' %}
# 參數直接寫在simple_tag名字的後面,可以有多個

#結果#
WERWERFSEFKJDDFGSDFEFLNNIDHGGINDSDGSEGSFVBNHR

過濾器filter:

    支持鏈式操作,每個結果都依次傳入下個|的過濾器

    過濾器調用格式{{ 值|過濾器名1:參數1|過濾器名2:參數2|...........}}

        說明:

                值:只能傳一個

                管道符|:左右都不能帶空格

                過濾器名:函數名

                :左右也不能帶空格

                參數:也只能傳一個,多個值可以使用加引號的字典或列表,"{'name':'david','age':19}"


    1、內置過濾器有30個:add\default\length\filesizeformat\slice\date\safe\truncatechars\truncatewords\cut\join\add\urlencode

# add 前值加
{{ 30|add:' 1'|add:' 3'|add:' 2'|add:' 4'|add:' 5' }}   # 多個|每次傳遞前面的值
# 結果:sq 1 3 2 4 5

# urlencode還記得javascript地址轉換嗎,一樣樣的
{{ "http://127.0.0.1:8000/a/test/666"|urlencode }}
結果:http%3A//127.0.0.1%3A8000/a/test/666

<br>
# join 使用指定字符連接列表或字符
# views傳入{'ls':[122,111,555]}
{{ ls|join:'@' }}
結果:122@111@555

{{ '1    2232'|join:'-' }}
結果:1- - - - -2-2-3-2

<br>
# cut 從字符串中刪除指定字符串
{{ '1112312312311221313'|cut:'23' }}
結果:1111111221313

<br>
# truncatechars從第n個字符刪除
{{ '1234567890'|truncatechars:2 }}
結果:1...

<br>
# truncatewords 以空格計算單詞個數,保留n個單詞
{{ '123 456 78 90'|truncatewords:2 }}
結果:123 456 …

<br>
# safe變量值是安全的,使HTML字符串轉義,link = "<p><a href='http://127.0.0.1:8000/a/test/666'>超鏈接</a> </p>"
{{ link }}
{#結果:<p><a href='http://127.0.0.1:8000/a/test/666'>超鏈接</a> </p>#}
{{ link|safe }}
結果:超鏈接

<br>
# date 格式化日期,傳入的是datetime.datetime.now()
{{ dt|date:"Y-m-d H:i:s" }}
# 結果:2019-10-11 14:58:16
{{ dt|date }}
# 結果:Oct. 11, 2019

<br>
# slice切片:
{{ '0123456'|slice:"0:3" }}
# 結果:0123

<br>
# filesizeformat,將數值轉換爲計算機單位
{{ 1000|filesizeformat }}   # 1000 bytes
{{ 10000|filesizeformat }}  # 9.8 KB
{{ 1000000000|filesizeformat }} # 953.7 MB

<br>
# default 如果前面的變量爲空或不存在,顯示默認值,不改變sname的值
{{ sname|default:'none' }}
# 結果: none

<br>
# length 返回長度
{{ 'abc'|length }}


    2、自定義filter:

        定義方式與simple_tag一樣,調用方式不一樣。

        4固定原則:在APP中新建包名是固定:templatetags

                           在views中,Library實例化名字固定:register=template.Library()

                           HTML裏調用格式固定

                           自定義函數,使用register.filter裝飾

                           只能使用兩個值,通常一個是修飾前,一個是修飾參數

        使用:在HTML上方{% load 定義的python文件%}

        調用:使用{{}}調用 ,格式:{{ str|filtername:args }}

# 在templatetags下新建python文件,custom_filter.py

from django import template                       # 導入template模塊
register = template.Library()                      # 實例化,名字必須是register

@register.filter
def filter_ellipsis(str1, args1):         # 最多兩個參數
    # 把str1截取args1長度並加...返回給前端
    if len(str1) > args1:
        str1 = str1[:args1] + r"..."
    return str1

        在HTML中上方載入自定義的python文件

{% load custom_tag %}
{{ "01234567890123456789012345678901234567890123456789"|filter_ellipsis:20 }}

# 結果:
01234567890123456789...



Filter與simple_tag區別:

    1、HTML標記不一樣,filter使用{{}},tag使用{%%}

    2、filter可以在if/for裏用於條件判斷,tag不可以

    3、filter最多傳兩個參數,tag可以多個




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章