Django 模板中 變量 過濾器 標籤 的使用方法

轉自:http://lishiguang.iteye.com/blog/1332529/


一、變量   
    1.變量的形式是:`variable`, 當模板引擎碰到變量的時候,引擎使用變量的值代替變量。
    2.使用dot(.)能夠訪問變量的屬性
    3.當模板引擎碰到dot的時候,查找的順序是什麼樣子呢?
        a.字典查找,例如:foo["var1"]
        b.屬性查找,例如:foo.bar
        c.方法查找,例如:foo.bar()
        d.list-index查找,例如foo[bar]

注意:方法查找比一般的查找要複雜一些
     (1)如果調用方法期間,方法拋出一個異常,那麼異常將會產生,除非異常對象帶有一個屬性silent_variable_failure,
        如果這個值是True,那麼將會返回一個空字串。
     (2)方法調用僅僅對那些沒有參數的方法纔會生效
     (3)一些方法會產生副作用,所以系統允許方法設置一個屬性alters_data,如果值爲True,那麼將不能夠調用
        其設置方法是:        def sensitive_function(self):
            #函數內容        sensitive_function.alters_data = True

    4.如果模板中使用的某個變量不存在,那麼模板系統將使用setting.py中 變量TEMPLATE_STRING_IF_INVALID的值進行替代,在默認情況下,該變量的值是''。

二、過濾器
    1.可以通過過濾器來修改變量的顯示,過濾器的形式是:{{ variable | filter }},管道符號'|'代表使用過濾器
    2.過濾器能夠採用鏈式的方式使用,例如:{{ text | escape | linebreaks }}
    3.過濾器還可以帶參數,例如: {{ bio|truncatewords:30 }}
    4.過濾器的參數中如果帶有空格,那麼需要用引號引起來,例如:{{ list | join : ", "}}
    5.django中30個內建的過濾器
        (1)add   
            使用形式爲:{{ value | add: "2"}}
            意義:將value的值增加2
        (2)addslashes
            使用形式爲:{{ value | addslashes }}
            意義:在value中的引號前增加反斜線
        (3)capfirst
            使用形式爲:{{ value | capfirst }}
            意義:value的第一個字符轉化成大寫形式
        (4)cut
             使用形式爲:{{ value | cut:arg}}, 例如,如果value是“String with spaces” arg是" "那麼輸出是"Stringwithspaces"
             意義:從給定value中刪除所有arg的值
        (5)date
             使用形式爲::
                 (a) {{ value | date:"D d M Y" }},例如,如果value是一個datetime對象(datetime.datetime.now())那麼輸出將是字符串"Wed 09 Jan 2008"
                 (b) {{ value | date }},這種形式沒有格式化字符串,這時候,格式化字符串會自動採用DATE_FORMAT所設置的形式。
             意義:將日期格式數據按照給定的格式輸出
        (6)default
             使用形式:{{ value | default: "nothing" }},例如,如果value是“”,那麼輸出將是nothing
             意義:如果value的意義是False,那麼輸出使用缺省值
        (7)default_if_none
             使用形式:{{ value | default_if_none:"nothing" }},例如,如果value是None,那麼輸出將是nothing
             意義:如果value是None,那麼輸出將使用缺省值
        (8)dictsort
             意義:如果value的值是一個字典,那麼返回值是按照關鍵字排序的結果
             使用形式:{{ value | dictsort:"name"}},例如,
             如果value是:

       [
           {'name': 'zed', 'age': 19},
           {'name': 'amy', 'age': 22},
           {'name': 'joe', 'age': 31},       ]
       那麼,輸出是:       [
           {'name': 'amy', 'age': 22},
           {'name': 'joe', 'age': 31},
           {'name': 'zed', 'age': 19},       ]

    (9)dictsortreversed
       意義:如果value的值是一個字典,那麼返回值是按照關鍵字排序的結果的反序
       使用形式:與上述(8)完全相同。
    (10)divisibleby
       使用形式:{{ value | divisibleby:arg}},如果value是21,arg是3,那麼輸出將是True
       意義:如果value能夠被arg整除,那麼返回值將是True
    (11)escape
       使用形式:{{ value | escape}}
       意義:替換value中的某些字符,以適應HTML格式,包括:        < is converted to &lt;
        > is converted to &gt;
        ' (single quote) is converted to &#39;
        " (double quote) is converted to &quot;
        & is converted to &amp;
        
       escape僅僅在輸出的時候才起作用,所以escape不能夠用在鏈式過濾器的中間,
他應該總是最後一個過濾器,如果想在鏈式過濾器的中間使用,那麼可以使用force_escape

    (12)escapejs
       使用形式:{{ value | escapejs }}
       意義:替換value中的某些字符,以適應JAVASCRIPT和JSON格式。
    (13)filesizeformat
       使用形式:{{ value | filesizeformat }}
       意義:格式化value,使其成爲易讀的文件大小,例如:13KB,4.1MB等。
    (14)first
       使用形式:{{ value | first }}
       意義:返回列表中的第一個Item,例如,如果value是列表['a','b','c'],那麼輸出將是'a'。
    (15)floatformat
       使用形式:{{ value | floatformat}}或者{{value|floatformat:arg}},
                 arg可以是正數也可以是負數。沒有參數的floatformat相當於floatformat:-1
       (1)如果不帶arg,那麼引擎會四捨五入,同時最多隻保留一位小數。
34.23234{{ value|floatformat }}34.2
34.00000{{ value|floatformat }}34
34.26000{{ value|floatformat }}34.3
(2)如果arg是正數,那麼引擎會四捨五入,同時保留arg位的小數。
34.23234{{ value|floatformat:3 }}34.232
34.00000{{ value|floatformat:3 }}34.000
34.26000{{ value|floatformat:3 }}34.260
(3)如果arg是負數,那麼引擎會四捨五入,如果有小數部分,那麼保留arg位小數;否則,則沒有任何小數部分。
34.23234{{ value|floatformat:"-3" }}34.232
34.00000{{ value|floatformat:"-3" }}34
34.26000{{ value|floatformat:"-3" }}34.26
(16)get_digit
       使用形式:{{ value | get_digit:"arg"}},例如,如果value是123456789,arg是2,那麼輸出是8
       意義:給定一個數字,返回,請求的數字,記住:1代表最右邊的數字,如果value不是合法輸入,
             那麼會返回所有原有值。
    (17)iriencode       使用形式:{{value | iriencode}}
       意義:如果value中有非ASCII字符,那麼將其進行抓化成URL中適合的編碼,如果value已經進行過URLENCODE,
             改操作就不會再起作用。
    (18)join
       使用形式:{{ value | join:"arg"}},如果value是['a','b','c'],arg是'//'那麼輸出是a//b//c
       意義:使用指定的字符串連接一個list,作用如同python的str.join(list)
    (19)last
       使用形式:{{ value | last }}
       意義:返回列表中的最後一個Item
    (20)length
       使用形式:{{ value | length }}
       意義:返回value的長度。
    (21)length_is
       使用形式:{{ value | length_is:"arg"}}
       意義:返回True,如果value的長度等於arg的時候,例如:如果value是['a','b','c'],arg是3,那麼返回True
    (22)linebreaks
       使用形式:{{value|linebreaks}}
       意義:value中的"\n"將被<br/>替代,並且整個value使用</p>包圍起來,從而適和HTML的格式
    (23)linebreaksbr
       使用形式:{{value |linebreaksbr}}
       意義:value中的"\n"將被<br/>替代
    (24)linenumbers
       使用形式:{{value | linenumbers}}
       意義:顯示的文本,帶有行數。
    (25)ljust
       使用形式:{{value | ljust}}
       意義:在一個給定寬度的字段中,左對齊顯示value    (25)center
       使用形式:{{value | center}}
       意義:在一個給定寬度的字段中,中心對齊顯示value     (25)rjust
       使用形式:{{value | rjust}}
       意義:在一個給定寬度的字段中,右對齊顯示value
    (26)lower
       使用形式:{{value | lower}}
       意義:將一個字符串轉換成小寫形式
    (27)make_list
       使用形式:{{value | make_list}}
       意義:將value轉換成一個list,對於字符串,轉換成字符list;對於整數,轉換成整數list
       例如value是Joel,那麼輸出將是[u'J',u'o',u'e',u'l'];value是123,那麼輸出將是[1,2,3]
    (28)pluralize
       使用形式:{{value | pluralize}},或者{{value | pluralize:"es"}},或者{{value | pluralize:"y,ies"}}
       意義:如果value不是1,則返回一個複數後綴,缺省的後綴是's'
    (29)random
       使用形式:{{value | random}}
       意義:從給定的list中返回一個任意的Item
    (30)removetags
       使用形式:{{value | removetags:"tag1 tag2 tag3..."}}
       意義:刪除value中tag1,tag2....的標籤。例如,如果value是<b>Joel</b> <button>is</button> a <span>slug</span>
             tags是"b span",那麼輸出將是:Joel <button>is</button> a slug
    (31)safe
       使用形式:{{value | safe}}
       意義:當系統設置autoescaping打開的時候,該過濾器使得輸出不進行escape轉換
    (32)safeseq
       與上述safe基本相同,但有一點不同的就是:safe是針對字符串,而safeseq是針對多個字符串組成的sequence
    (33)slice
       使用形式:{{some_list | slice:":2"}}
       意義:與python語法中的slice相同,:2表示第一的第二個元素
    (34)slugify
        使用形式:{{value | slugify}}
        意義:將value轉換成小寫形式,同事刪除所有分單詞字符,並將空格變成橫線
              例如:如果value是Joel is a slug,那麼輸出將是joel-is-a-slug
    (35)stringformat
        這個不經常用,先不說
    (36)striptags
        使用形式:{{value | striptags}}
        意義:刪除value中的所有HTML標籤
    (37)time
        使用形式:{{value | time:"H:i"}}或者{{value | time}}
        意義:格式化時間輸出,如果time後面沒有格式化參數,那麼輸出按照TIME_FORMAT中設置的進行。
    (38)title
        轉換一個字符串成爲title格式。
    (39)truncatewords
        使用形式:{{value | truncatewords:2}}
        意義:將value切成truncatewords指定的單詞數目
        例如,如果value是Joel is a slug 那麼輸出將是:Joel is ...
    (40)truncatewords_html
        使用形式同(39)
        意義:truncation點之前如果某個標籤打開了,但是沒有關閉,那麼在truncation點會立即關閉。
              因爲這個操作的效率比truncatewords低,所有只有在value是html格式時,才考慮使用。
    (41)upper
        轉換一個字符串爲大寫形式
    (42)urlencode
        將一個字符串進行URLEncode
    (43)urlize
        意義:將一個字符串中的URL轉化成可點擊的形式。
        使用形式:{{ value | urlize }}
        例如,如果value是Check out www.djangoproject.com,那麼輸出將是:              Check out <a href="http://www.djangoproject.com">www.djangoproject.com</a>
    (44)urlizetrunc
        使用形式:{{ value | urlizetrunc:15}}
        意義:與(43)相同,但是有一點不同就是現實的鏈接字符會被truncate成特定的長度,後面以...現實。
    (45)wordcount
        返回字符串中單詞的數目
    (46)wordwrap
        使用形式:{{value | wordwrap:5}}
        意義:按照指定的長度包裝字符串
        例如,如果value是Joel is a slug,那麼輸出將會是:
        Joel
        is a
        slug
    (47)timesince
        使用形式:{{value | timesince:arg}}
        意義:返回參數arg到value的天數和小時數
        例如,如果 blog_date 是一個日期實例表示 2006-06-01 午夜, 而 comment_date 是一個日期實例表示 2006-06-01 早上8點,
              那麼 {{ comment_date|timesince:blog_date }} 將返回 "8 hours".
    (48)timeuntil
        使用形式:{{value | timeuntil}}
        意義:與(47)基本相同,一個不同點就是,返回的是value距離當前日期的天數和小時數。

三、標籤
    1.標籤的形式是:{% tag %},標籤要比變量複雜
    2.標籤的作用
      (1)在輸出時創建一些文本
      (2)通過執行循環和一些邏輯來實現控制流
      (3)裝載一些外部信息進入模板
    3.內建標籤
      (1)autoescape
         使用形式:
             {% autoescape off %}
                 (內容)
             {% endautoescape %}
         意義:當某塊內容不需要自動轉義的時候,這樣寫就可以了。當然如果塊內某些地方需要轉義的話,調用filter也可以。
      (2)block
         使用形式:
             {% block %}
                 (定義塊內容)
             {% endblock %}
         意義:定義一個塊,該塊能夠被繼承他的子孫模板重寫
      (3)comment
         使用形式:
             {% comment %}
                  (內容)
             {% endcomment %}
         意義:模板系統會忽略該標籤內部的所有內容。
      (4)cycle
         使用形式:
         例如:
             <tr class="{% cycle list%}">
              ...
             </tr>
         意義:在循環時輪流使用給定的字符串列表中的值。
         
      (5)extends
         使用形式:{% extends "base.html" %}或者{% extends variable %}變量可以是一個字符串,也可以是一個模板對象。
         意義:表示本模板要對指定的父模板進行擴展。
      (6)filter
         使用形式:
             {%filter force_escape|lower%}
                 (內容)
             {%endfilter%}
         意義:將filter 標籤圈定的內容執行過濾器操作。
      (7)firstof
         使用形式:{%firstof var1 var2 var3%}
         意義:輸出第一個值不等於False的變量
         等價於:               
         {% if var1 %}
             {{ var1 }}         {% else %}
             {% if var2 %}
                 {{ var2 }}             {% else %}
                 {% if var3 %}
                     {{ var3 }}                 {% endif %}
             {% endif %}
         {% endif %}
      (8)for
         使用形式:
             {% for variable in list/dict %}
                   (使用variable)
             {% endfor%}
         意義:循環list中的每個值,進行相應的輸出
         注意:(a)也可以反向遍歷{% for variable in list/dict reversed %}
               (b)也可以{% for x, y in points %} points中的每個元素爲 (x,y)
               (c)也可以{% for key,value in data.items %}   data是一個dictionary 
         for loop中定義的一些內建變量
         forloop.counter         當前的迭代器數目(從1開始)         forloop.counter0        當前的迭代器數目(從0開始)         forloop.revcounter      當前的反向迭代器數目(從1開始)         forloop.revcounter0     當前的反向迭代器數目(從0開始)
         forloop.first           值爲True,如果是第一次通過迭代器         forloop.last            值爲True,如果是最後一次通過迭代器
         forloop.parentloop      對於嵌套循環,這是當前循環的上一層循環      (9)for ... empty
         使用形式如下:
             {% for varibale in list %}
                  (內容1)
             {% empty %}
                  (內容2)
             {% endfor %}
         意義:當list是空的時候,能夠執行內容2,其形式等同於,先if判斷list是否存在,然後在根據情況做什麼操作。
      (10)if
         使用形式如下 :
             {% if variable %}
                 (內容1)
             {% else %}
                 (內容2)
             {% endif %}
         注意:variable中可以使用and or 或者not,但是有一條必須記住,就是不允許and 和 or一起使用
       (11)ifchanged
          使用形式:
          (a)如果直接檢測循環變量是否變化,那麼使用:
              {% ifchanged %}  
                  (內容)
              {% endifchanged %}
          (b)如果檢測循環變量的某個dot變量,例如循環變量是date,那麼檢測date.hour,那麼使用:              {% ifchanged date.hour%}  
                  (內容)
              {% endifchanged %}    
          (c)ifchanged也可以加上一個{% else %}語句
          意義:檢測本次循環的值和上一次循環的值一樣不一樣,只能用在循環裏面。 
       (12)ifequal
          使用形式:
              {% ifequal variable1 variable2 %}
                  ...
              {% endifequal %}
          意義:判斷兩個變量是否相等。
       (13)ifnotequal
          使用與(12)相同
       (14)include
          使用形式:{% include "foo/bar.html" %}或者{% include template_name %}
          意義:將另外一個模板文件中的內容添加到該文件中。注意區別extend是繼承。
       (15)now
          使用形式:{% now "jS F Y H:i "%},注意存在需要轉義的情況例如{% now "jS o\f F" %},因爲f是格式化字符串
          
具體的格式化字符串如下所示
a'a.m.' or 'p.m.' (Note that this is slightly different than PHP's output, because this includes periods to match Associated Press style.)'a.m.'
A'AM' or 'PM'.'AM'
bMonth, textual, 3 letters, lowercase.'jan'
BNot implemented.
dDay of the month, 2 digits with leading zeros.'01' to '31'
DDay of the week, textual, 3 letters.'Fri'
fTime, in 12-hour hours and minutes, with minutes left off if they're zero. Proprietary extension.'1''1:30'
FMonth, textual, long.'January'
gHour, 12-hour format without leading zeros.'1' to '12'
GHour, 24-hour format without leading zeros.'0' to '23'
hHour, 12-hour format.'01' to '12'
HHour, 24-hour format.'00' to '23'
iMinutes.'00' to '59'
INot implemented.
jDay of the month without leading zeros.'1' to '31'
lDay of the week, textual, long.'Friday'
LBoolean for whether it's a leap year.True or False
mMonth, 2 digits with leading zeros.'01' to '12'
MMonth, textual, 3 letters.'Jan'
nMonth without leading zeros.'1' to '12'
NMonth abbreviation in Associated Press style. Proprietary extension.'Jan.''Feb.''March''May'
ODifference to Greenwich time in hours.'+0200'
PTime, in 12-hour hours, minutes and 'a.m.'/'p.m.', with minutes left off if they're zero and the special-case strings 'midnight' and 'noon' if appropriate. Proprietary extension.'1 a.m.''1:30 p.m.''midnight','noon''12:30 p.m.'
rRFC 2822 formatted date.'Thu, 21 Dec 2000 16:01:07+0200'
sSeconds, 2 digits with leading zeros.'00' to '59'
SEnglish ordinal suffix for day of the month, 2 characters.'st''nd''rd' or 'th'
tNumber of days in the given month.28 to 31
TTime zone of this machine.'EST''MDT'
UNot implemented.
wDay of the week, digits without leading zeros.'0' (Sunday) to '6' (Saturday)
WISO-8601 week number of year, with weeks starting on Monday.153
yYear, 2 digits.'99'
YYear, 4 digits.'1999'
zDay of the year.0 to 365
ZTime zone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive.
(16)spaceless
         使用形式:{% spaceless %}
                        (內容)
                   {% endspaceless %}
         意義:刪除包圍內容中的所有tab或者回車字符。
      (17)template
          使用形式:{% templatetag %}
          意義:模板系統本身沒有轉義的概念,因此如果要輸出一個像“{%”這樣的東東,就需要採用這種方式,否則就會語法錯誤
其參數有:
openblock{%
closeblock%}
openvariable{{
closevariable}}
openbrace{
closebrace}
opencomment{#
closecomment#}
      (18)with
         使用形式:
             {% with  "expensive var1" as var2 %}
             {% endwith %}
         意義:當一個變量的訪問消耗很大的模板解析時,可以用另外一個變量替換它,這種替換只有在with內部有效。
      (19)url
         使用形式:{% url path.to.some_view arg1,arg2 %}
         意義:給定某個module中函數的名字,給定參數,那麼模板引擎給你一個URL,從而避免硬編碼URL到代碼中
         
         注意:前提是URLconf中存在相應的映射,如果URLconf中沒有該映射,那麼會拋出異常,
               這是可以選擇使用
               {% url path.to.view arg1 ,arg2 as the url %}               <a href="{{ the_url }}">Link to optional stuff</a>
               其實這相當於               {% url path.to.view as the_url %}               {% if the_url %}
                   <a href="{{ the_url }}">Link to optional stuff</a>               {% endif %}


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