django中模板變量與內置標簽以及過濾器


本文參考 官方文檔

一  模板變量

  格式: {{ variable_name }}  

    variable_name   命名規則與變量命名規則類似,允許字符數字下划線,不允許標點。

    variable_name后面可以跟dot  .  以此來訪問變量的屬性。查詢順序:

      字典查詢  

      屬性或者方法查詢: 若為方法查詢,則要求該方法不需要傳入任何參數(且該方法的圓括號要省略)。

               調用該方法后,會將該方法返回的結果賦予該變量。

      數字索引查詢

 

二  內置標簽

  格式: {% tag %}

  1  block  定義一個可以被子模板覆蓋的區域。

{% block block_name %}   
該文本可被替換
{% endblock %}           <--結束標簽

  2  comment  注釋標簽。模板引擎會忽略掉 {% comment %} 和 {% endcomment %} 之間的所有內容。

  3  csrf_token  用來CSRF保護的標簽,詳情請閱讀 官方文檔

  4  cycle  循環使用標簽中給出的參數(可以是字符串),參數被耗盡時,則重新開始循環,支持 as 關鍵字。

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}
實例

  5  autoescape  控制標簽內容是否被  轉義  。值為 on/off。如果開啟自動轉義的話,標簽會被過濾掉,比如:

    <   小於號被過濾為  : &lt;

    >   大於號被過濾為  : &gt;

{% for o in some_list %}
    <tr class="{% autoescape off %}{% cycle rowvalue1 rowvalue2 %}{% endautoescape %}">
        ...
    </tr>
{% endfor %}
View Code

  6  debug  輸出完整的調試信息,包含上下文以及導入的模塊

  7  extends  使用該標簽在模板中繼承某個模板。用法:

    {% extends 'parent.html' %}  或者:

    {% extends variable %}

    在django1.10中可以使用相對路徑了, ‘ . ’表示當前目錄, ‘ .. ‘表示當前目錄的父目錄

  8  filter  使用一個或者多個過濾器過濾某個塊的內容,可以使用管道符號 | 連接多個過濾器。過濾器也可以有參數。

{% filter force_escape|lower %}
    This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}
View Code

  9  firstof  輸出第一個非False參數的值。在django1.9及以后支持 as 關鍵字。

{% firstof var1 var2 var3 %}
<!--  相當於 -->
{% if var1 %}
    {{ var1 }}
{% elif var2 %}
    {{ var2 }}
{% elif var3 %}
    {{ var3 }}
{% endif %}

<!--  保底值 -->
{% firstof var1 var2 var3 "fallback value" %}

<!-- 關閉自動轉義 -->
{% autoescape off %}
    {% firstof var1 var2 var3 "<strong>fallback value</strong>" %}
{% endautoescape %}
View Code

  10  for 循環

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

<!-- 遍歷字典 -->
{% for key, value in data.items %}
    {{ key }}: {{ value }}
{% endfor %}
View Code
forloop.counter         The current iteration of the loop (1-indexed)          當前循環次數的整數計數器,從一開始計數
forloop.counter0        The current iteration of the loop (0-indexed)          .......從0開始計數
forloop.revcounter      The number of iterations from the end of the loop (1-indexed) 循環中剩余項的整數變量,最后一次執行時變為1
forloop.revcounter0     The number of iterations from the end of the loop (0-indexed)  ......變為0
forloop.first           True if this is the first time through the loop          若當前循環為第一次循環,該值為True
forloop.last            True if this is the last time through the loop          ......為False
forloop.parentloop      For nested loops, this is the loop surrounding the current one  .....指向當前循環的上一次循環的forloop

    for ... empty 

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>
View Code

  11  if...elif...else  

    1  支持 and  or  not,且and和or可以聯用。但and的優先級高於or

{% if athlete_list and coach_list or cheerleader_list %}

<!-- 解釋為 -->
if (athlete_list and coach_list) or cheerleader_list
View Code

    2  if標簽中不允許使用 () ,可以依靠嵌套if來實現

    3  if標簽中的條件判斷語句有 == ,  !=  ,  > ,  <  ,  >= , <= , in , not in , is , not is 。 is和not is是django1.10中的新特性。

    4  if標簽中可以使用過濾器

    5  if標簽衍生出了ifequal和ifnotequal,{% ifequal a b %} 等於 {% if a==b %}

  12  ifchange  檢查循環中的某個值在最近一次循環時是否改變。可以使用 else 標簽。用法有兩個:

    1  它會把要渲染的內容與前一次作比較,發生變化時才顯示它。

<h1>Archive for {{ year }}</h1>

{% for date in days %}
    {% ifchanged %}<h3>{{ date|date:"F" }}</h3>{% endifchanged %}
    <a href="{{ date|date:"M/d"|lower }}/">{{ date|date:"j" }}</a>
{% endfor %}
顯示日期列表,當月份改變時才顯示

    2  如果給的是一個或者多個變量,就會檢查其中任一個變量是否發生改變。

{% for date in days %}
    {% ifchanged date.date %} {{ date.date }} {% endifchanged %}
    {% ifchanged date.hour date.date %}
        {{ date.hour }}
    {% endifchanged %}
{% endfor %}
日期每一次變動都會顯示日期,並且日期或者小時中的任何一個變動就會顯示小時

  13  include  加載一個模板,並使用當前的context上下文渲染它。在一個模板中包含其他模板的一種方法。

    用法: {% include 'polls/index.html' %}

    django1.10中可以使用相對路徑。

  14  load  裝載一個自定義的模板標簽集合,詳細信息請看 官方文檔

  15  now  根據指定的格式顯示當前的日期或者時間

格式字符串     描述     示例輸出
a     'a.m.' 或者 'p.m.' 。(這與PHP中的輸出略有不同,因為為了匹配美聯社風格,它包含了句點。     'a.m.'
A     'AM' 或者 'PM' 。     'AM'
b     月份,文字式的,三個字母,小寫。     'jan'
d     一月的第幾天,兩位數字,帶前導零。     '01' 到 '31'
D     一周的第幾天,文字式的,三個字母。     'Fri'
f     時間,12小時制的小時和分鍾數,如果分鍾數為零則不顯示。     '1' , '1:30'
F     月份,文字式的,全名。     'January'
g     小時,12小時制,沒有前導零。     '1' 到 '12'
G     小時,24小時制,沒有前導零。     '0' 到 '23'
h     小時,12小時制。     '01' 到 '12'
H     小時,24小時制。     '00' 到 '23'
i     分鍾。     '00' 到 '59'
j     一月的第幾天,不帶前導零。     '1' 到 '31'
l     一周的第幾天,文字式的,全名。     'Friday'
L     是否為閏年的布爾值。     True 到 False
m     月份,兩位數字,帶前導零。     '01' 到 '12'
M     月份,文字式的,三個字母。     'Jan'
n     月份,沒有前導零。     '1' 到 '12'
N     美聯社風格的月份縮寫。     'Jan.' , 'Feb.' ,'March' , 'May'
O     與格林威治標准時間的時間差(以小時計)。     '+0200'
P     時間,12小時制的小時分鍾數以及a.m./p.m.,分鍾數如果為零則不顯示,用字符串表示特殊時間點,如 'midnight' 和 'noon' 。     '1 a.m.' , '1:30 p.m.' ,'midnight' ,'noon' , '12:30 p.m.'
r     RFC 822 格式的日期。     'Thu, 21 Dec 2000 16:01:07 +0200'
s     秒數,兩位數字,帶前導零。     '00' 到 '59'
S     英語序數后綴,用於表示一個月的第幾天,兩個字母。     'st' , 'nd' , 'rd'到 'th'
t     指定月份的天數。     28 到 31
T     本機的時區。     'EST' , 'MDT'
w     一周的第幾天,數字,帶前導零。     '0' (Sunday) 到'6' (Saturday)
W     ISO-8601 一年中的第幾周,一周從星期一開始。     1 , 23
y     年份,兩位數字。     '99'
Y     年份,四位數字。     '1999'
z     一年的第幾天。     0 到 365
Z     以秒計的時區偏移量,這個偏移量對於UTC西部時區總是負數,對於UTC東部時區總是正數。
格式

  16  regrop  把一組相似的對象根據某個共有的屬性重新分組。支持as關鍵字

cities = [
    {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
    {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
    {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
    {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
    {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]
# 若想按照如下格式顯示

 

  我們可以使用regroup標簽

{% regroup cities by country as country_list %}

<ul>
{% for country in country_list %}
    <li>{{ country.grouper }}
    <ul>
        {% for city in country.list %}
          <li>{{ city.name }}: {{ city.population }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>
View Code

  17  spaceless  去除html標簽左右的空白符,不會去除標簽內容中的空白符

  18  url  返回一個不帶域名的絕對路徑引用。我們在URLconf中配置的url('pattern',view_function,name='url_name')中的name在這里就會

    派上用場。支持as關鍵字

    用法: {% url 'url_name'  value1 value2.... %}

    舉例:  當我們URLconf文件中有這么一行: url(r'^hello/(?P<num>[0-9]{1})$',view.hello,name='hello')

      對應的template文件內容為: {% url 'hello' num %}  

      當我們在瀏覽器中輸入 localhost:8000/hello/2 時, 頁面就會返回 /hello/2/

三  內置過濾器

一般用法:{{ value|filter:argu }}

多個過濾器可以鏈用:{{ valeu|filter01:argu1|filter02:argu2 }}

  1  add    將argu添加至value中。

    若value為4,argu為2,則輸出6

    若value為[1,2,3],argu為[4,5,6]  則輸出[1,2,3,4,5,6]

  2  addslashes  在引號前添加反斜線。用法: {{ value|addslashes }}

    若value為"I'm mncu",則輸出" I \'m mncu "

  3  capfirst  首字母大寫

  4  center  給定一個長度,讓字符串居中。{{ value|center:"15" }}

  5  cut  刪除value中所有的argu。若value為'hello  world'  argu為' ',則輸出’helloworld'

  6  date  將一個date類型根據指定的格式輸出

a     'a.m.' 或者 'p.m.' 。(這與PHP中的輸出略有不同,因為為了匹配美聯社風格,它包含了句點。     'a.m.'
A     'AM' 或者 'PM' 。     'AM'
b     月份,文字式的,三個字母,小寫。     'jan'
d     一月的第幾天,兩位數字,帶前導零。     '01' 到 '31'
D     一周的第幾天,文字式的,三個字母。     'Fri'
f     時間,12小時制的小時和分鍾數,如果分鍾數為零則不顯示。     '1' , '1:30'
F     月份,文字式的,全名。     'January'
g     小時,12小時制,沒有前導零。     '1' 到 '12'
G     小時,24小時制,沒有前導零。     '0' 到 '23'
h     小時,12小時制。     '01' 到 '12'
H     小時,24小時制。     '00' 到 '23'
i     分鍾。     '00' 到 '59'
j     一月的第幾天,不帶前導零。     '1' 到 '31'
l     一周的第幾天,文字式的,全名。     'Friday'
L     是否為閏年的布爾值。     True 到 False
m     月份,兩位數字,帶前導零。     '01' 到 '12'
M     月份,文字式的,三個字母。     'Jan'
n     月份,沒有前導零。     '1' 到 '12'
N     美聯社風格的月份縮寫。     'Jan.' , 'Feb.' ,'March' , 'May'
O     與格林威治標准時間的時間差(以小時計)。     '+0200'
P     時間,12小時制的小時分鍾數以及a.m./p.m.,分鍾數如果為零則不顯示,用字符串表示特殊時間點,如 'midnight' 和 'noon' 。     '1 a.m.' , '1:30 p.m.' ,'midnight' ,'noon' , '12:30 p.m.'
r     RFC 822 格式的日期。     'Thu, 21 Dec 2000 16:01:07 +0200'
s     秒數,兩位數字,帶前導零。     '00' 到 '59'
S     英語序數后綴,用於表示一個月的第幾天,兩個字母。     'st' , 'nd' , 'rd'到 'th'
t     指定月份的天數。     28 到 31
T     本機的時區。     'EST' , 'MDT'
w     一周的第幾天,數字,帶前導零。     '0' (Sunday) 到'6' (Saturday)
W     ISO-8601 一年中的第幾周,一周從星期一開始。     1 , 23
y     年份,兩位數字。     '99'
Y     年份,四位數字。     '1999'
z     一年的第幾天。     0 到 365
Z     以秒計的時區偏移量,這個偏移量對於UTC西部時區總是負數,對於UTC東部時區總是正數。     -43200 到
格式
#  如果要顯示  2016-8-8 8:08  這樣的格式
{{ datetime_instance|date:"Y-m-j G:i" }}
演示

  7  default  若value的值為False,則使用argu作為默認值

  8  default_if_none   只有當value的值為none時,才使用argu作為默認值。

  9  dictsort  根據指定的argu對字典進行排序。value必須為字典類型

  10  dictsortrevesed  逆序排序

  11  escape  根據以下規則轉義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;

  12  filesizeformat  將value轉換為人類易讀的文件尺寸。若value為123456789 ,則輸出117.7MB

  13  first  返回value的第一個元素

  14  floatformat  若argu沒有給出,則默認顯示value的四舍五入后的保留一位小數的數字。value必須為數字。

  15  get_digit  value為數字,返回從右數第argu個數字。{{ value|get_digit:"2" }}   若value為1234567,則返回6

  16  join  類似於Python中的str.join(list)

  17  last  與first相反,返回value中最后一個元素

  18  length  返回value的長度

  19  length_is  若value的長度為argu,則返回True

  20  linebreaks  將純文本中的換行符轉換為<br />和<p>

  21  linenumbers  給value添加行號

  22  ljust  根據給定的argu寬度的域內左對齊

  23  lower  將value轉換為小寫

  24  make_list  將value轉換為list,若value為‘123’,則輸出[1,2,3]

  25  phone2numeric  將一個電話號碼(可能包含字母)轉化等價的數字值.比如: ‘800-COLLECT’ 將被轉化為 ‘800-2655328’.

  26  random  從value中隨機挑選一個元素並返回

  27  rjust  與ljust相反

  28  safe  在django輸出之前,不會對字符串進行轉義。若使用多個過濾器,盡量將safe過濾器寫在最后。

  29  slice  返回value的片段,value必需為list。類似於Python中list中slice的語法。{{ some_list|slice:":2" }}  返回前兩個元素

  30  slugify  轉化為小寫, 移去非單詞字符(字母數字和下划線),將空白轉化為連字符,去除前后空白

  31  stringformat  根據給定參數(一個格式字符串)格式化一個變量, 這個格式字符串使用 Python 字符串格式化語法,

     例外之處是 “%” 運算符被省略.

  32  striptags  過濾掉html標簽

  33  time  根據指定的argu格式,對time進行格式化

  34  title  將給定的字符串value轉化為標題類型的格式,也就是第一個單詞的首字母大寫,其余小寫。

  35  truncatechars  若字符串value的長度大於argu,則將大於的部分省略。

    {{ value|truncatechars:9 }}  若value為 'joel is a slug'  則輸出'joel i...'

  36  upper  將value大寫

  37  wordcont  輸出單詞的個數(單詞以空格區分)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM