標籤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可以多個