過濾器
過濾器用于修改變數或標簽引數的值,Django的模板語言中提供了大約六十個內置過濾器,
過濾器的語法: {{ value|filter_name:引數 }}
使用管道符"|"來應用過濾器,例如:{{ name|lower }}會將name變數應用lower過濾器之后再顯示它的值,lower在這里的作用是將文本全都變成小寫,
注意事項:
- 過濾器支持“鏈式”操作,即一個過濾器的輸出作為另一個過濾器的輸入,
- 過濾器可以接受引數,例如:{{ sss|truncatewords:30 }},這將顯示sss的前30個詞,
- 過濾器引數包含空格的話,必須用引號包裹起來,比如使用逗號和空格去連接一個串列中的元素,如:{{ list|join:', ' }}
- '|'左右沒有空格,
- 為模版過濾器提供引數的方式是:過濾器后加個冒號,再緊跟引數,中間不能有空格,目前只能為過濾器最多提供一個引數,
default
如果一個變數是false或者為空,使用給定的默認值, 否則,使用變數的值,{{ value|default:"nothing"}},如果value沒有傳值或者值為空的話就顯示nothing
length
回傳值的長度,作用于字串和串列,{{ value|length }},回傳value的長度,如 value=https://www.cnblogs.com/wby-110/p/['a', 'b', 'c']的話,就顯示3,對于未定義的變數,過濾器回傳0,
filesizeformat
將值格式化為一個 “人類可讀的” 檔案尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等),例如:
{{ value|filesizeformat }}
如果 value 是 123456789,輸出將會是 117.7 MB,
slice
切片,如果 value="https://www.cnblogs.com/wby-110/p/hello world",還有其他可切片的資料型別
{{value|slice:"2:-1"}}
date
根據給定格式對一個日期變數進行格式化,如果 value=https://www.cnblogs.com/wby-110/p/datetime.datetime.now()
{{ value|date:"Y-m-d H:i:s"}}
可用的格式字串:
| 格式化字符 | 描述 | 示例輸出 |
|---|---|---|
| a | 'a.m.'或'p.m.' | 'a.m.' |
| A | 'AM'或'PM' | 'AM' |
| b | 月份,文字形式,3個字母,小寫, | “jan” |
| B | 未實作, | |
| c | ISO 8601格式 | 2008-01-02T10:30:00.000123+02:00 |
| d | 月的日子,帶前導零的2位數字, | '01'到'31' |
| D | 周幾的文字表述形式,3個字母, | 'Fri' |
| e | 時區名稱 | '','GMT','-500','US/Eastern'等 |
| E | 月份,分地區, | |
| f | 時間 | '1','1:30' |
| F | 月,文字形式, | 'January' |
| g | 12小時格式,無前導零, | '1'到'12' |
| G | 24小時格式,無前導零, | '0'到'23' |
| h | 12小時格式, | '01'到'12' |
| H | 24小時格式, | '00'到'23' |
| i | 分鐘 | '00'到'59' |
| I | 夏令時間,無論是否生效, | '1'或'0' |
| j | 沒有前導零的月份的日子, | '1'到'31' |
| l | 星期幾,完整英文名 | 'Friday' |
| L | 布林值是否是一個閏年, | True或False |
| m | 月,2位數字帶前導零, | '01'到'12' |
| M | 月,文字,3個字母, | “Jan” |
| n | 月無前導零, | '1'到'12' |
| N | 美聯社風格的月份縮寫, | 'Jan.','Feb.','March','May' |
| o | ISO-8601周編號 | '1999' |
| O | 與格林威治時間的差,單位小時, | '+0200' |
| P | 時間為12小時 | '1 am','1:30 pm','midnight','noon','12:30 pm'> |
| r | RFC 5322格式化日期, | 'Thu, 21 Dec 2000 16:01:07 +0200' |
| s | 秒,帶前導零的2位數字, | '00'到'59' |
| S | 一個月的英文序數后綴,2個字符, | 'st','nd','rd'或'th' |
| t | 給定月份的天數, | 28 to 31 |
| T | 本機的時區, | 'EST','MDT' |
| u | 微秒, | 000000 to 999999 |
| U | 自Unix Epoch以來的秒數(1970年1月1日00:00:00 UTC), | |
| w | 星期幾,數字無前導零, | '0'(星期日)至'6'(星期六) |
| W | ISO-8601周數,周數從星期一開始, | 1,53 |
| y | 年份,2位數字, | '99' |
| Y | 年,4位數, | '1999' |
| z | 一年中的日子 | 0到365 |
| Z | 時區偏移量,單位為秒, | -43200到43200 |
safe
將字串標記為安全,不需要轉義,Django的模板中在進行模板渲染的時候會對HTML標簽和JS等語法標簽進行自動轉義,比如如果有人給評論的時候寫了一段js代碼,這個評論一提交,js代碼就執行啦,所以瀏覽器不讓這么做,給你轉義了,但是有的時候我們不希望這些HTML元素被轉義,比如我們做一個內容管理系統,后臺添加的文章中是經過修飾的,這些修飾可能是通過一個類似于FCKeditor編輯加注了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的源檔案,為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變數我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義,
{{ value|safe}}
safeseq
將safe過濾器應用于序列的每個元素, 與對序列進行其他過濾操作(例如join)一起使用時非常有用,
{{ some_list|safeseq|join:", " }}
在這種情況下,不能直接使用safe過濾器,因為它首先將變數轉換為字串,而不是使用序列的各個元素,
truncatechars**
如果字串字符多于指定的字符數量,那么會被截斷,截斷的字串將以可翻譯的省略號序列(“…”)結尾,
引數:截斷的字符數
{{ value|truncatechars:9}}
#注意:9截斷出來的是6個字符+3個省略號,配合前端的點擊事件就能展開,
truncatewords
在一定數量的字后截斷字串,是截多少個單詞,這個以字的個數計數,而不是字符計數,
{{ value|truncatewords:2}}
如果value是Joel is a slug, 輸出為Joel is ...
字串中的換行符將被洗掉,
cut
移除value中所有的與給出的變數相同的字串
{{ value|cut:' ' }}
如果value為'i love you',那么將輸出'iloveyou'.
join
使用字串連接串列,{{ list|join:', ' }},就像Python的str.join(list),
{{ value|join:" // " }}
如果value是串列['a', 'b', 'c'] ,輸出為`a // b // c`,
timesince
將日期格式設為自該日期起的時間(例如,“4天,6小時”),
采用一個可選引數,它是一個包含用作比較點的日期的變數,例如,如果blog_date是表示2006年6月1日午夜的日期實體,并且comment_date是2006年6月1日08:00,則以下將回傳“8 hours”:
{{ blog_date|timesince:comment_date }}
分鐘是所使用的最小單位,對于相對于比較點的未來的任何日期,將回傳“0分鐘”,
timeuntil
類似于timesince,它測量從現在開始直到給定日期或日期時間的時間,例如,如果今天是2006年6月1日,而conference_date是2006年6月29日,則{{ conference_date | timeuntil }}將回傳“4 weeks”,
可選引數是一個包含用作比較點的日期變數,如果from_date為2006年6月22日,則以下內容將回傳“1 weeks”:
{{ conference_date|timeuntil:from_date }}
Django內置過濾器總覽
可以查詢下表來總覽Django的內置過濾器:
| 過濾器 | 說明 |
|---|---|
| add | 加法 |
| addslashes | 添加斜杠 |
| capfirst | 首字母大寫 |
| center | 文本居中 |
| cut | 切除字符 |
| date | 日期格式化 |
| default | 設定默認值 |
| default_if_none | 為None設定默認值 |
| dictsort | 字典排序 |
| dictsortreversed | 字典反向排序 |
| divisibleby | 整除判斷 |
| escape | 轉義 |
| escapejs | 轉義js代碼 |
| filesizeformat | 檔案尺寸人性化顯示 |
| first | 第一個元素 |
| floatformat | 浮點數格式化 |
| force_escape | 強制立刻轉義 |
| get_digit | 獲取數字 |
| iriencode | 轉換IRI |
| join | 字串列鏈接 |
| last | 最后一個 |
| length | 長度 |
| length_is | 長度等于 |
| linebreaks | 行轉換 |
| linebreaksbr | 行轉換 |
| linenumbers | 行號 |
| ljust | 左對齊 |
| lower | 小寫 |
| make_list | 分割成字串列 |
| phone2numeric | 電話號碼 |
| pluralize | 復數形式 |
| pprint | 除錯 |
| random | 隨機獲取 |
| rjust | 右對齊 |
| safe | 安全確認 |
| safeseq | 串列安全確認 |
| slice | 切片 |
| slugify | 轉換成ASCII |
| stringformat | 字串格式化 |
| striptags | 去除HTML中的標簽 |
| time | 時間格式化 |
| timesince | 從何時開始 |
| timeuntil | 到何時多久 |
| title | 所有單詞首字母大寫 |
| truncatechars | 截斷字符 |
| truncatechars_html | 截斷字符 |
| truncatewords | 截斷單詞 |
| truncatewords_html | 截斷單詞 |
| unordered_list | 無序串列 |
| upper | 大寫 |
| urlencode | 轉義url |
| urlize | url轉成可點擊的鏈接 |
| urlizetrunc | urlize的截斷方式 |
| wordcount | 單詞計數 |
| wordwrap | 單詞包裹 |
| yesno | 將True,False和None,映射成字串‘yes’,‘no’,‘maybe’ |
add
把add后的引數加給value,像這樣:
{{ value|add:"2" }}
過濾器首先會強制把兩個值轉換成Int型別, 如果強制轉換失敗, 它會試圖使用各種方式把兩個值相加,如:
{{ first|add:second }}
如果first是[1, 2, 3],second是[4, 5, 6], 將會輸出[1, 2, 3, 4, 5, 6].
addslashes
在引號前面加上斜桿,常用于在CSV中轉義字串,
{{ value|addslashes }}
如果value是"I'm using Django", 輸出將變成 "I\'m using Django",
capfirst
大寫變數的第一個字母, 如果第一個字符不是字母,該過濾器將不會生效,
{{ value|capfirst }}
center
在給定的寬度范圍內居中.
"{{ value|center:"15" }}"
default_if_none
如果(且僅當)value為None,則使用給定的默認值,
{{ value|default_if_none:"nothing" }}
dictsort
接受一個包含字典元素的串列,并回傳按引數中給出的鍵排序后的串列,
{{ value|dictsort:"name" }}
也可以做更復雜的事情,如:
books=[
{'title': '1984', 'author': {'name': 'George', 'age': 45}},
{'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}},
{'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}},
]
{% for book in books|dictsort:"author.age" %}
* {{ book.title }} ({{ book.author.name }})
{% endfor %}
輸出:
* Alice (Lewis)
* 1984 (George)
* Timequake (Kurt)
dictsort也可以按指定索引對多維串列進行排序,必須提供整數索引,不能是字串,像這樣:
{{ value|dictsort:0 }}
如果value為:
[
('a', '42'),
('c', 'string'),
('b', 'foo'),
]
那么輸出將是:
[
('a', '42'),
('b', 'foo'),
('c', 'string'),
]
dictsortreversed
dictsort過濾器的反序功能,
divisibleby
如果value可以被引數整除,則回傳True,
{{ value|divisibleby:"3" }}
escape
轉義字串的HTML,轉義僅在字串輸出時應用,因此在鏈接的過濾器序列中escape的位置無關緊要, 如果要立即應用轉義,使用force_escape過濾器,
escapejs
轉義用于JavaScript字串的字符, 確保在使用模板生成JavaScript / JSON時避免語法錯誤,
{{ value|escapejs }}
first
回傳串列中的第一項,
{{ value|first }}
floatformat
當不使用引數時,將浮點數舍入到小數點后一位,但前提是要顯示小數部分, 像這樣:
value 模板語法 輸出
34.23234 {{ value | floatformat }} 34.2
34.00000 {{ value | floatformat }} 34
如果與數字整數引數一起使用,將數字四舍五入為小數位數:
34.00000 {{ value | floatformat:3 }} 34.000
34.26000 {{ value | floatformat:3 }} 34.260
傳遞0(零)作為引數,它將使float浮動到最接近的整數:
34.00000 {{ value | floatformat:“0” }} 34
39.56000 {{ value | floatformat:“0” }} 40
如果傳遞給floatformat的引數為負,則會將一個數字四舍五入到小數點后的位置,但前提是要顯示一個小數部分:
34.23234 {{ value | floatformat:“ - 3” }} 34.232
34.00000 {{ value | floatformat:“ - 3” }} 34
get_digit
給定一個整數,回傳所請求的數字,1表示最右邊的數字,2表示第二個最右邊的數字,以此類推,
{{ value|get_digit:"2" }}
iriencode
將IRI(國際化資源識別符號)轉換為適合包含在URL中的字串,
{{ value|iriencode }}
last
回傳串列中的最后一個專案,
{{ value|last }}
length_is
如果物件的長度等于引數值,則回傳True,否則回傳False,
{{ value|length_is:"4" }}
linebreaks
替換純文本中的換行符為標簽,
{{ value|linebreaks }}
# 如果value是Joel\nis a slug,輸出將為Joel is a slug,
linenumbers
顯示帶行號的文本,
{{ value|linenumbers }}
如果value為:
one
two
three
輸出將是:
1. one
2. two
3. three
ljust
給定寬度下左對齊,
"{{ value|ljust:"10" }}"
lower
將字串轉換為全部小寫,
{{ value|lower }}
make_list
將物件轉換為字符的串列,對于字串,直接拆分為單個字符的串列,對于整數,在創建串列之前將引數強制轉換為unicode字串,
{{ value|make_list }}
如果value為123,輸出為串列['1', '2', '3'],
phone2numeric
將電話號碼(可能包含字母)轉換為其等效數字,
{{ value|phone2numeric }}
如果value為`800-COLLECT`,輸出將為800-2655328,
pluralize
如果值不是1,則回傳一個復數形式,通常在后面添加's'表示,
You have {{ num_messages }} message{{ num_messages|pluralize }}.
如果num_messages是1,則輸出為You have 1 message, 如果num_messages是2,輸出為You have 2 messages,
另外如果需要的不是's'后綴的話, 可以提供一個備選的引數給過濾器:
You have {{ num_walruses }} walrus{{ num_walruses|pluralize:"es" }}.
對于非一般形式的復數,可以同時指定單復數形式,用逗號隔開,例如:
You have {{ num_cherries }} cherr{{ num_cherries|pluralize:"y,ies" }}.
pprint
用于除錯的過濾器,
random
回傳給定串列中的隨機項,
{{ value|random }}
rjust
右對齊給定寬度欄位中的值,
"{{ value|rjust:"10" }}"
slugify
轉換為ASCII,空格轉換為連字符,洗掉不是字母數字,下劃線或連字符的字符,轉換為小寫,還會去除前導和尾隨空格,
{{ value|slugify }}
如果value是Joel is a slug,輸出為joel-is-a-slug,
stringformat
根據引數,格式化變數,
{{ value|stringformat:"E" }}
如果value為10,輸出將為1.000000E+01,
striptags
盡可能的去除HTML中的標簽,
{{ value|striptags }}
time
根據給定的格式,格式化時間,給定格式可以是預定義的TIME_FORMAT,也可以是與date過濾器相同的自定義格式,
{{ value|time:"H:i" }}
如果value等于datetime.datetime.now(),則輸出字串01:23,
time過濾器只接受格式字串中與時間相關的引數,而不是日期,
timesince
將日期格式設為自該日期起的時間(例如,“4天,6小時”),
title
將所有單詞的首字母大寫,其它字母小寫,
{{ value|title }}
truncatechars_html
類似于truncatechars,但是會保留HTML標記,
{{ value|truncatechars_html:9 }}
如果value是Joel is a slug,輸出Joel i...,
truncatewords_html
類似于truncatewords,但是保留HTML標記,
{{ value|truncatewords_html:2 }}
HTML內容中的換行符將保留,
unordered_list
接收一個嵌套的串列,回傳一個HTML的無序串列,
例如,如果var 包含['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']], 那么{{ var|unordered_list }}將回傳:
<li>States
<ul>
<li>Kansas
<ul>
<li>Lawrence</li>
<li>Topeka</li>
</ul>
</li>
<li>Illinois</li>
</ul>
</li>
upper
將字串轉換為全部大寫的形式:
{{ value|upper }}
urlencode
轉義要在URL中使用的值,
{{ value|urlencode }}
如果value為https://www.example.org/foo?a=b&c=d,輸出https%3A//www.example.org/foo%3Fa%3Db%26c%3Dd,
urlize
將文字中的網址和電子郵件地址轉換為可點擊的鏈接,
該模板標簽適用于前綴為http://,https://的鏈接,或者www,
由urlize生成的鏈接會向其中添加rel="nofollow"屬性,
{{ value|urlize }}
如果value是Check out www.djangoproject.com,輸出Check out [www.djangoproject.com](http://www.djangoproject.com),
除了超級鏈接之外,urlize也會將電子郵件地址轉換為郵件地址鏈接, 如果value是Send questions to [email protected],輸出將是Send questions to [[email protected]](mailto:[email protected]),
urlizetrunc
將網址和電子郵件地址轉換為可點擊的鏈接,就像urlize,但截斷長度超過給定字符數限制的網址,
{{ value|urlizetrunc:15 }}
如果value是Check out www.djangoproject.com,將輸出Check out [www.djangopr...](http://www.djangoproject.com)'.
與urlize一樣,此過濾器應僅應用于純文本,
wordcount
回傳單詞的個數,
{{ value|wordcount }}
如果value是Joel is a slug,輸出4,
wordwrap
以指定的行長度,換行單詞,
{{ value|wordwrap:5 }}
如果value是Joel is a slug,輸出為:
Joel
is a
slug
yesno
將True,False和None,映射成字串‘yes’,‘no’,‘maybe’,
{{ value|yesno:"yeah,no,maybe" }}
國際化標簽和過濾器
Django還提供了一些模板標簽和過濾器,用以控制模板中國際化的每個方面,它們允許對翻譯,格式化和時區轉換進行粒度控制,
i18n
此標簽允許在模板中指定可翻譯文本,要啟用它,請將USE_I18N設定為True,然后加載{% load i18n %},
l10n
此標簽提供對模板的本地化控制,只需要使用{% load l10n %},通常將USE_L10N設定為True,以便本地化默認處于活動狀態,
tz
此標簽對模板中的時區進行控制, 像l10n,只需要使用{% load tz },但通常還會將USE_TZ設定為True,以便默認情況下轉換為本地時間,
靜態檔案相關
Django附帶了一些其他模板標簽,必須在INSTALLED_APPS設定中顯式啟用,并在模板中啟用{% load %}標記,
static
static標簽用于鏈接保存在STATIC_ROOT中的靜態檔案,js、css、img等都叫做靜態檔案,關于django中靜態檔案的配置,需要在settings組態檔里面寫上這寫內容:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'demo'), # 第二個引數就是專案中存放靜態檔案的檔案夾名稱
]
# STATIC_URL = '/xxx/' #別名,可以隨便寫,但是如果你改名字,并且頁面里面是通過/xxx/bootstrap.css的時候,如果這里的別名你改成了/static/的話,你前端頁面的路徑要改成/static/bootstrap.css,所以我們都是用下面的load static的方式來使用靜態檔案路徑,
目錄:別名也是一種安全機制,瀏覽器上通過除錯臺能夠看到的是別名的名字,這樣別人就不能知道你靜態檔案夾的名字了,不然別人就能通過這個檔案夾路徑進行攻擊,
前端頁面引入靜態檔案的寫法,因為別名也可能會修改,所以使用路徑的時候通過load static來找到別名,通過別名映射路徑的方式來獲取靜態檔案,
{% static %}
{% load static %}
<img src=https://www.cnblogs.com/wby-110/p/"{% static "images/hi.jpg" %}" alt="Hi!" />
參考JS檔案時使用:
{% load static %}
<script src=https://www.cnblogs.com/wby-110/p/"{% static "mytest.js" %}"></script>
某個檔案多處被用到可以存為一個變數
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src=https://www.cnblogs.com/wby-110/p/"{{ myphoto }}"></img>
{% get_static_prefix %}:手動拼接,先獲取靜態檔案包的別名然后再拼接靜態檔案,一般不使用這個,
{% load static %}
<img src=https://www.cnblogs.com/wby-110/p/"{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
或者:
{% load static %}
{% get_static_prefix as STATIC_PREFIX %}
<img src=https://www.cnblogs.com/wby-110/p/"{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
還可以使用變數:
{% load static %}
<link rel="stylesheet" href=https://www.cnblogs.com/wby-110/p/"{% static user_stylesheet %}" type="text/css" media="screen" />
注意一個html檔案中寫相對路徑時需要注意的一個問題,例子:
<form action="/login/"></form>
<img src=https://www.cnblogs.com/wby-110/p/"/static/1.jpg" alt="">
等標簽需要寫路徑的地方,如果寫的是相對路徑,那么前置的/這個斜杠必須寫上,不然這個請求會拼接當前網頁的路徑來發送請求,就不能匹配我們的后端路徑了
django.contrib.humanize
一組Django模板過濾器,用于向資料添加“人性化”,更加可讀,為了提高模板系統對人類的友好性,Django在django.contrib.humanize中提供了一系列的模板過濾器,
需要把django.contrib.humanize添加到INSTALLED_APPS設定中來激活這些過濾器,然后在模板中使用{% load humanize %}標簽,就可以使用下面的過濾器了,
apnumber
對于數字1~9,回傳英文單詞,否則回傳數字本身, 這遵循了出版圖書的格式,可以傳遞整數,或者整數的字串形式,
intcomma
將整數或浮點數(或兩者的字串表示形式)轉換為每隔三位數字包含逗號的字串,
例如:45000 會變成 45,000
如果啟動了Format localization,還將遵循用戶本地國家標準,例如,在德語('de')中:450000 會變成 '450.000',
intword
將大整數(或整數的字串表示形式)轉換為友好的文本表示形式,適用于超過一百萬的數字,
例如:1200000 會變成 1.2 million,支持高達10的100次方 (Googol) 的整數,
如果啟動了Format localization,還將遵循用戶本地國家標準,例如,在德語('de')中:1200000000 會變成 '1,2 Milliarden',
naturalday
對于當天或者一天之內的日期,回傳“today”,“tomorrow”或者“yesterday”的表示形式,視情況而定,否則,使用傳進來的格式字串進行日期格式化,其它的日期,還是按照傳統的方法展示,
例如(“今天”是2007年2月17日),16 Feb 2007 會變成 yesterday,
naturaltime
對于日期時間的值,回傳一個字串來表示多少秒、分鐘或者小時之前,如果超過一天之前,則回退為使用timesince格式,如果是未來的日期時間,回傳值會自動使用合適的文字表述,
例如(“現在”是2007年2月17日16時30分0秒):
17 Feb 2007 16:30:00 會變成 now,
17 Feb 2007 13:31:29 會變成 2 hours ago,
16 Feb 2007 13:30:00 會變成 1 day, 3 hours ago,
17 Feb 2007 16:34:35 會變成 4 minutes from now,
17 Feb 2007 17:30:29 會變成 an hour from now,
18 Feb 2007 16:31:29 會變成 1 day from now,
26 Feb 2007 18:31:29 會變成 1 week, 2 days from now,
ordinal
將一個整數轉化為它的序數詞字串,例如:1 會變成 1st,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/79375.html
標籤:Python
上一篇:模塊回圈匯入問題,區分py檔案的兩種用途,模塊的搜索路徑與查找優先級,軟體開發的目錄規范
下一篇:函式的嵌套
