那麼首先來說明下什麼時Filter什麼時tag了,如何去區分了
1、在使用上差別:
filter 使用方法{{ obj|filter:param }}
tag使用方法{% tags %}
2、filter可以使用作為if判斷語句的标簽,标簽時不可以的
3、filter最多隻能傳遞兩個參數,而且tag可以傳遞多個
filter使用說明
文法的格式如下
{{ obj|filter:param }}
obj 我們需要處理的對象
filter 我們的filter,常見有如下羅列出的
param filter的參數
1、add
添加相應的值,這個比較好了解,例如:
{{ 3|add:2 }} //那麼這個就是3+2最後結果等于5,當然了我們的3一般時python傳過來的變量了。
注意前面的obj隻能時整形數值,字元串無法相加
age|add:3
2、addslashes
給變量中的引号前加上斜線,就是轉譯引号,
例如:
{{"q'mm'df"|addslashes}}
那麼該輸出接入如下
q\'mm\'df
3、capfirst
首字目大寫,很好了解不多說
例如:
{{"q'mm'df"|capfirst}}
那麼輸出結果如下:
Q'mm'df
4、cut
把指定的字元串剪切掉
例如我們把單引号去掉:
{{"q'mm'df"|cut:"'"}}
輸出如下:
Qmmdf
5、date
格式化時間日期顯示,注意了,需要處理的對象必須時時間對象類型
例如:
dt變量類容為:{{ dt }}<br>
處理後的内容:{{ dt|date:'Y-m-d' }}
輸出結果如下:
dt變量類容為:April 6, 2018, 1:07 p.m.
處理後的内容:2018-04-06
6、default
如果值是False,就替換成設定的預設值,否則就是用本來的值
例如:
{{False|default:"這是False"}}
<br>
{{True|default:"這是True"}}
輸出結果如下:
這是False
True
7、default_if_none
如果值是None,就替換成設定的預設值,否則就使用本來的值,和default差不多原理
例如:
{{ None|default_if_none:"沒有值預設替換" }}
<br>
{{ " "|default_if_none:"就算有一個空格也是不會替換的" }}
輸入結果如下:
沒有值預設替換
8、filesizeformat
對數字進行格式化,IT中經常使用到的容量顯示技術
例如:
{{ "5120"|filesizeformat }}
結果就是
5.0 KB
9、first、last、slice
字元串處理,first取第一個字元,last去最後一個字元,slice切片和python中一樣使用
例如:
{{ "5120"|last }}
<br>
{{ "5120"|first }}
<br>
{{ "5120"|slice:":-2" }}
結果:
5
51
10、safe、autoescape、striptags
讓浏覽器渲染我們的變量内容,
例如:
原始變量:{{ dt }}
<br>
有時候我們想浏覽器去渲染我們在資料庫等地方取出來的html語言:
<br>
第一種方法,也是最常用的,使用safe:<br>
{{ dt|safe }}
<br>
第二種方法,使用autoescape off,注意了autoescape 就是标簽了:<br>
{% autoescape off%}
{{ dt }}
{% endautoescape %}
<br>
第三種方法,使用striptags,注意該方法,會去除html語言标記哦:<br>
{{ dt|striptags }}
效果如下:
當然還有很多的filter,以上羅列出來的隻是我們常用的,更多的filter請檢視官方文檔
https://docs.djangoproject.com/en/2.0/ref/templates/builtins/
一般常用的标簽tag說明:
1、最常用的if标簽 {% if %}
{% if 條件表達式 %}
表達式成立執行代碼塊
{% elif 條件表達式 %}
表達式成立執行代碼塊
{% else %}
所有表達式不成立執行代碼塊
{% endif %}
2、循環标簽{% for %}的使用
{% for object in objects %}
執行的循環體
{% endfor %}
3、{%csrf_token%} 跨站攻擊校驗
請求網頁時會生成一個csrf校驗字元串,防止跨站請求工具,注意如果我們使用render_to_response方法,這個就不生效。
使用方法,在from表單中直接使用{% csrf_token %}
在前台我們每次請求,會随機生産一個校驗碼,在表單送出時背景會進行校驗
4、{% url %} 連結url
顯示指定路由的URL路徑,具體檢視上面的兩個截圖,我們需要在url路由指定name,前面進行調用
5、{% with %} 變量替換
例如把一個長的變量做一個短的别名
{% with total=www.qnjslm.com %}
{{ total }}
{% endwith %}
6、{% verbatim %}: 禁止進行渲染
有時候我們需要在頁面上顯示模闆語言的原型,就會用到verbatim ,還記得上面的safe的filter
{% verbatim %}
{{ 123|add:2 }}
{% endverbatim %}
7、{% load %}加載标簽庫
我們使用最多的就是加載自定義标簽庫了,産靠下一節的示範
現在來介紹我們自定義Tag以及Filter
第一步:在APP目錄下建立一個子產品名字為templatetags(注意名字必須時這個)
第二步:在templatetags目錄下建立py檔案,這個檔案名字可以随意了
第三步:建立我們自定義的filter以及tag
1、首先需要引用template,如果需要傳回html内容需要引入mark_safe
from django import template
from django.utils.safestring import mark_safe
2、執行個體化一個對象,注意這裡必須使用register 來接收,不可以使用其他名稱
register = template.Library()
3、定義自已的函數,使用裝飾器@register.filter、@register.simple_tag
4、在Django的設定中,在APP中一定加載我們的APP名稱
5、在模闆中我們使用load加載我們的檔案名,就可以安裝上面的方法進行使用
{% load my_test %}
詳細代碼(my_test):
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.filter
def filter_multi(v1, v2):
return v1 * v2
@register.simple_tag
def tag_multi(v1, v2, v3):
return v1 * v2 + v3
@register.simple_tag
def input_multi(id, name, class_name):
result = "<input id='%s' class='%s' name='%s'/>" % (id, class_name, name)
return mark_safe(result)
模闆中我們使用
前台的效果如下圖
模闆的标簽(Tags):
标簽的使用:{% Tags %}
autoescape
自動轉義标簽,要在html中原樣輸出html标簽的時候使用
{% autoescape on %}
{{ body }}
{% endautoescape %}
對body的内容進行轉義,原樣輸出html标簽
block
模闆繼承,詳細看模闆繼承
comment
多行注解,忽略、不輸出{% comment %}{% endcommit %}标簽裡面的内容
csrf_token
防止跨站點攻擊,在表單<form>标簽中添加{%csrf_token%}
cycle
用于循環産生字段
{% for o in some_list %}
{% cycle 'one' 'two' %}<br/>
{% endfor %}
這将會在for循環中交替出現row1和row2字元串
結果為(some_list的長度為5):
one
two
one
two
one
cycle的參數可以為字元串或者為變量
{% cycle 'one' 'two' as str %}->{{str}}
可以在循環中多次引用字元串
結果為:
one->one
two->two
one->one
two->two
one->one
debug
輸出整個調試資訊負載,包括目前上下文和導入的子產品
extends
與block标簽配合使用
filter
{% filter upper|lower %}
this is text
{% endfilter %}
将filter标簽裡面的經過upper處理在将結果經過lower處理,filter參數可選擇多個
firstof
輸出第一個不是False的參數
{% firstof var1 var2 var3 %}
等同于
{% if var1 %}
{{ var1 }}
{% elif var2 %}
{{ var2 }}
{% elif var3 %}
{{ var3 }}
{% endif %}
{% firstof var1 var2 var3 "fallback value" %}
當所有參數都為False時,輸出"fallback value"
此标簽自動轉義預設值參數:
{% autoescape off %}
{% firstof var1 var2 var3 "<strong>fallback value</strong>" %}
{% endautoescape %}
可以使用safe管道符忽略轉義:
{% firstof var1 var2|safe var3 "<strong>fallback value</strong>"|safe %}
可以用一下文法将輸出值儲存在變量value中:
{% firstof var1 var2 var3 as value %}
for
點運算符:
variable.object
優先傳回
varialbe['object'] #字典類型查找
variable.object #屬性查找
variable.object() #方法調用
variable[object] #清單索引查找
for循環設定中可用的變量
forloop.counter 循環的目前疊代(1索引)
forloop.counter0 循環的目前疊代(0索引)
forloop.revcounter 循環結束時的疊代次數(1索引)
forloop.revcounter0 循環結束時的疊代次數(0索引)
forloop.first 如果這是第一次疊代,則為真
forloop.last 如果這是最後一次疊代,則為真
forloop.parentloop 對于嵌套循環,這是上一循環的forloop對象
for....empty
配合for标簽使用
{% for number in numbers %}
number
{% empty %} #numbers對象為空時執行
the numbers is empty
{% endfor %}
if
條件判斷語句
{% if athlete_list %}
one
{% elif athlete_in_locker_room_list %}
two
{% else %}
three
{% endif %}
在if标簽中可以使用布爾運算符or and not等
在同一标簽中同時使用and 和or時and的優先級将大于or
{% if athlete_list and coach_list or cheerleader_list %}
等于
if (athlete_list and coach_list) or cheerleader_list
if标簽也可以用運算符 == != < > <= >= in is
{% if a > b and b > c %}
也可以在if标簽中使用過濾器
{% if messages|length >= 100 %}
You have lots of messages today!
{% endif %}
ifchanged
{% for t in text %}
{% ifchanged %}{{ t }}{% endifchanged %} #當t的内容與上次重複時,不顯示出來
{%endfor%}
#也可以指定判斷某個變量
{% ifchanged date.date %} {{ date.date }} {% endifchanged %}
#也可以添加{% else %}标簽
{% ifchanged match.ballot_id %}
some
{% else %}
some
{% endifchanged %}
include
加載一個模闆并且用目前的上下文内容渲染它。這标簽能用來在一個模闆中包含另一個模闆,模闆的名字可以是一個變量或者是字元串。
{% include "foo/bar.html" %}
模闆名是相對于模闆加載器的根目錄的。字元串參數可以用./或者../開頭。
此标簽的參數也可以指定一個擁有render()方法渲染内容的Template對象。
#也可以在标簽中用with指定參數
{% include "name_snippet.html" with person="Jane" greeting="Hello" %}
#可以指定字段only來指定隻接受include内的參數來渲染
{% include "name_snippet.html" with greeting="Hi" only %}
load
用于裝載自定義的标簽或者過濾器的庫
lorem
用法:
{% lorem [count] [method] [random] %}
count:用來指定要生成的段落或者單詞的數目(預設為1)
method:w代表單詞,p代表html段落,b代表純文字段落
用來生成測試文本
now
用于格式化顯示時間
It is {% now "jS F Y H:i" %} #可以使用反斜杠\進行轉義
#也可以将輸出的字元串作為變量儲存下來
{% now "Y" as current_year %}
regroup
?
resetcycle
重置cycle的計數
#也可以指定重置的cycle标簽
{% cycle 'one' 'two' as one %}
{% cycle 'one' 'two' as two %}
{% resetcycle one %}
spaceless
清除html标簽直接的空白符号(隻删除标簽之間的,标簽和文本之間的不删除)
{% spaceless %}
<p>
<a href="foo/">Foo</a>
</p>
{% endspaceless %}
templatetag
用法:
{% templatetag param %}
将參數進行轉義
param:
openblock ----> {%
closeblock ----> %}
openvariable ----> {{
closevariable ----> }}
openbrace----> {
closebrace----> }
opencomment----> {#
closecomment----> #}
url
用給定的名稱和可選參數傳回結對路徑引用,任何特殊的字元都将會用iri_to_uri()編碼。
文法:
{% url 'some-url-name' v1 v2 %}
#第一個參數是url的name,它可以是字元串或者變量
#額外的參數是可選的,将用作為url上的參數
#也可以使用關鍵詞參數,但位置參數和關鍵詞參數不要混合使用
{% url 'some-url-name' arg1=v1 arg2=v2 %}
如果指定的url不存在,則将會抛出一個NoReverseMatch錯誤,這将導緻伺服器傳回一個錯誤頁面。
#一下調用将不會直接生成url,而是會儲存在變量the_url中
{% url 'some-url-name' arg arg2 as the_url %}
#可以使用标簽{% block %}限定變量the_url作用的範圍
verbatim
停止模闆渲染引擎呈現此塊标記的内容。
widthratio
按照比例計算數值
{% widthratio this_value max_value max_width %}
#可以使用as儲存數值
with
簡化複雜的變量調用
{% with total=business.employees.count %}
#這裡可以直接使用total,total的作用域隻存在标簽體中
{% endwith %}
#可以指定更多的參數
{% with alpha=1 beta=2 %}
...
{% endwith %}
過濾器:
内置過濾器:django.template.defaultfilters
過濾器改變變量的值和改變标簽的參數
文法:
{{ django|title }} #将變量django内容裡面的每個單詞首字元轉換為大寫
可以向過濾器傳遞參數:
{{ my_date|date:"Y-m-d" }}
内建的過濾器:
add
#将參數加載變量value上
{{ value|add:"2" }}
#變量和參數也可以是其它的類型(例如string list)
addslashes
轉義
{{ value|addslashes }}
#如果value是:I'm using Django
将輸出:I\'m using Django
capfirst
将值的第一個字母大寫
center
{{ value|center:"15" }}
#将value居中在寬度為15
cut
{{ value|cut:param }}
#将value中的全部param去掉
date
按照給定的格式去格式化日期
詳細
default
當值為False時,則輸出預設參數
#如果值value為False,則輸出nothing
{{ value|default:"nothing" }}
default_if_none
和default類似,不過僅在值為None時才輸出預設值
dictsort
将清單中的字典按照給定的參數作為字段進行排序
[
{'name': 'zed', 'age': 19},
{'name': 'amy', 'age': 22},
{'name': 'joe', 'age': 31},
]
參數為name
則輸出:
[
{'name': 'amy', 'age': 22},
{'name': 'joe', 'age': 31},
{'name': 'zed', 'age': 19},
]
或者是:
{{ value|dictsort:0 }} #參數應該輸入int類型,而不是字元串類型
value:
[
('a', '42'),
('c', 'string'),
('b', 'foo'),
]
排序後:
[
('a', '42'),
('b', 'foo'),
('c', 'string'),
]
dictsortreversed
工作原理和上面一樣,不過是倒序排序
divisibleby
#如果value能被參數'3'整除,則輸出True,否則輸出False
{{ value|divisibleby:"3" }}
escape
轉義,在html中輸出html标簽的字元串表達
escapejs
??
filesizeformat
{{ value|filesizeformat }} #将value轉換為有利于了解的檔案大小字元串表示
first
傳回清單中的第一個元素
{{ value|first }}
floatformat
如果不帶參數,則四舍五入到小數點後一位
如果帶參數,則四舍五入保留參數大小的小數個數(n為參數大小)
如果參數為零,則不保留小數
如果參數為負數,則四舍五入保留參數絕對值大小的小數個數,如果小數點後全為零,則忽略小數
force_escape
類似于escape,此過濾器立即應用并傳回一個新的轉義字元串
get_digit
給定一個整數,傳回請求的數字
{{ value|get_digit:"2" }}
#傳回value的十位數字
#若參數為3,則傳回百位數字
iriencode
将value轉換為适合包含在URL中的字元串表達形式
join
用給定的字元串連接配接清單,傳回最終字元串表達形式
類似python的str.join(list)
json_script
New in Django 2.1
安全地将Python對象輸出為JSON,包裝在<script>标記中,以便與JavaScript一起使用。
{{ value|json_script:"hello-data" }}
#如果value為{'hello': 'world'}
#則輸出:
<script id="hello-data" type="application/json">{"hello": "world"}</script>
last
傳回清單中最後的元素
{{ value|last }}
length
傳回序列對象的長度,對于未知類型,則傳回0
length_is
如果給定序列的長度等于傳入的參數,則傳回True,否則傳回False
linebreaks
将換行符轉換為<br>
一個新行加上一個空行變成了段落換行符</p>
linebreaksbr
将換行符轉換為<br>
linenumbers
顯示文本的行數
one
two
three
轉換為:
1. one
2. two
3. three
ljust
{{ value|ljust:"10" }}
#如果value是django,則輸出 "Django "
lower
将給定的字元串全部轉換為小寫字元
make_list
将給定的字元串轉換為清單
phone2numeric
将電話号碼轉換成數字輸出
pluralize
應用于英文複數場景,參數可以定義輸出的字尾
pprint
調試用??
random
随機輸出給定的清單中的元素
{{ value|random }}
#如果value是['a','b','c'],則随機輸出其中的一個
rjust
類似于ljust,不過對齊方式是向右
safe
标記内容,表示不用被轉義
safeseq
類似于safe,但應用于清單中的每個參數
slice
給定一個清單,傳回清單的切片對象
slugify
轉換為ASCII。将空格轉換為連字元。删除非字母數字、下劃線或連字元的字元。轉換為小寫的。還可以去掉開頭和結尾的空白。
"Joel is a slug" 轉換為 "joel-is-a-slug"
stringformat
根據給定的參數格式化變量
{{ value|stringformat:"E" }}
#如果value為10,則輸出1.000000E+01
striptags
将給定的字元串中的html的全部标簽删除
time
格式化時間
{{ value|time:"H:i" }} #value為時間
timesince
{{ start|timesince:later }}
#代表自從start之後,到later過了多少時間
#相當于傳回later-start
timeuntil
{{ start|timeuntil:before }}
#before為可選參數,代表在start之間的時間
#傳回從bofore到start過了多少時間(start-before)
title
将給定的字元串中所有的單詞的首字母轉換為大寫,其它字元轉換為小寫
truncatechars
縮短字元串長度為給定的參數,縮短後字元串帶...字尾
{{ value|truncatechars:9 }}
#value="Joel is a slug"
#輸出"Joel i..."
truncatechars_html
類似truncatechars,但忽略html标簽,将标簽裡面的内容自動縮短。
{{ value|truncatechars_html:9 }}
#value="<p>Joel is a slug</p>"
#輸出"<p>Joel i...</p>"
truncatewords
類似truncatechars,但以一個單詞為機關計算。
truncatewords_html
類似truncatechars_html,但以一個單詞為機關計算。
unordered_list
根據給定的嵌套的list自動生成嵌套的清單
upper
将給定的字元串中的字母全部轉換為大寫字母
urlencode
轉義URL中使用的值
urlize
将給定的url位址轉換為html中可點選的連結
urlizetrunc
類似于urlize和truncatechars的結合體
wordcount
傳回給定字元串中單詞的數量
wordwrap
指定每行的長度
{{ value|wordwrap:5 }}
#如果value為"Joel is a slug"
#則輸出
Joel
is a
slug
yesno
将給定值的布爾值轉換為自定義的參數
{{ value|yesno:"yeah,no,maybe" }}
#如果value為True,則輸出yeah
#如果為False,則輸出no
#如果為None,則輸出maybe(此參數可省略,如果省略,則預設輸出False對應的結果)