天天看點

Django的filter和tag使用說明和如何自定義

那麼首先來說明下什麼時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 }}

效果如下:

Django的filter和tag使用說明和如何自定義

當然還有很多的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 %}

Django的filter和tag使用說明和如何自定義

在前台我們每次請求,會随機生産一個校驗碼,在表單送出時背景會進行校驗

Django的filter和tag使用說明和如何自定義

4、{% url %} 連結url

顯示指定路由的URL路徑,具體檢視上面的兩個截圖,我們需要在url路由指定name,前面進行調用

Django的filter和tag使用說明和如何自定義

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名稱

Django的filter和tag使用說明和如何自定義

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)

模闆中我們使用

Django的filter和tag使用說明和如何自定義

前台的效果如下圖

Django的filter和tag使用說明和如何自定義

模闆的标簽(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對應的結果)