組成:HTML代碼+邏輯控制代碼
邏輯控制代碼的組成
1、變量 {{ var_name }}
深度變量的查找:萬能的句點號
#最好是用幾個例子來說明一下。 # 首先,句點可用於訪問列表索引,例如: >>> from django.template import Template, Context >>> t = Template('Item 2 is {{ items.2 }}.') >>> c = Context({'items': ['apples', 'bananas', 'carrots']}) >>> t.render(c) 'Item 2 is carrots.' #假設你要向模板傳遞一個 Python 字典。 要通過字典鍵訪問該字典的值,可使用一個句點: >>> from django.template import Template, Context >>> person = {'name': 'Sally', 'age': '43'} >>> t = Template('{{ person.name }} is {{ person.age }} years old.') >>> c = Context({'person': person}) >>> t.render(c) 'Sally is 43 years old.' #同樣,也可以通過句點來訪問對象的屬性。 比方說, Python 的 datetime.date 對象有 #year 、 month 和 day 幾個屬性,你同樣可以在模板中使用句點來訪問這些屬性: >>> from django.template import Template, Context >>> import datetime >>> d = datetime.date(1993, 5, 2) >>> d.year >>> d.month >>> d.day >>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.') >>> c = Context({'date': d}) >>> t.render(c) 'The month is 5 and the year is 1993.' # 這個例子使用了一個自定義的類,演示了通過實例變量加一點(dots)來訪問它的屬性,這個方法適 # 用於任意的對象。 >>> from django.template import Template, Context >>> class Person(object): ... def __init__(self, first_name, last_name): ... self.first_name, self.last_name = first_name, last_name >>> t = Template('Hello, {{ person.first_name }} {{ person.last_name }}.') >>> c = Context({'person': Person('John', 'Smith')}) >>> t.render(c) 'Hello, John Smith.' # 點語法也可以用來引用對象的方法。 例如,每個 Python 字符串都有 upper() 和 isdigit() # 方法,你在模板中可以使用同樣的句點語法來調用它們: >>> from django.template import Template, Context >>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}') >>> t.render(Context({'var': 'hello'})) 'hello -- HELLO -- False' >>> t.render(Context({'var': '123'})) '123 -- 123 -- True' # 注意這里調用方法時並沒有使用圓括號 而且也無法給該方法傳遞參數;你只能調用不需參數的方法。
變量的過濾器 {{obj|filter:param}}
(1)add
使用形式為:{{ value | add: "2"}}
意義:將value的值增加2
- 1
- 2
- 3
(2)addslashes
使用形式為:{{ value | addslashes }}
意義:在value中的引號前增加反斜線
- 1
- 2
- 3
(3)capfirst
使用形式為:{{ value | capfirst }}
意義:value的第一個字符轉化成大寫形式
- 1
- 2
- 3
(4)cut
使用形式為:{{ value | cut:arg}}, 例如,如果value是“String with spaces” arg是" "那么輸出是"Stringwithspaces"
意義:從給定value中刪除所有arg的值
- 1
- 2
- 3
(5)date
使用形式為::
(a) {{ value | date:"D d M Y" }},例如,如果value是一個datetime對象(datetime.datetime.now())那么輸出將是字符串"Wed 09 Jan 2008"
(b) {{ value | date }},這種形式沒有格式化字符串,這時候,格式化字符串會自動采用DATE_FORMAT所設置的形式。
意義:將日期格式數據按照給定的格式輸出
- 1
- 2
- 3
- 4
- 5
(6)default
使用形式:{{ value | default: "nothing" }},例如,如果value是“”,那么輸出將是nothing
意義:如果value的意義是False,那么輸出使用缺省值
- 1
- 2
- 3
(7)default_if_none
使用形式:{{ value | default_if_none:"nothing" }},例如,如果value是None,那么輸出將是nothing
意義:如果value是None,那么輸出將使用缺省值
- 1
- 2
- 3
(8)dictsort
意義:如果value的值是一個字典,那么返回值是按照關鍵字排序的結果
使用形式:{{ value | dictsort:"name"}},例如,
如果value是:
- 1
- 2
- 3
- 4
[
{‘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 <
> is converted to >
’ (single quote) is converted to '
” (double quote) is converted to "
& is converted to &
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
(26)center
使用形式:{{value | center}}
意義:在一個給定寬度的字段中,中心對齊顯示value
(27)rjust
使用形式:{{value | rjust}}
意義:在一個給定寬度的字段中,右對齊顯示value
(28)lower
使用形式:{{value | lower}}
意義:將一個字符串轉換成小寫形式
(29)make_list
使用形式:{{value | make_list}}
意義:將value轉換成一個list,對於字符串,轉換成字符list;對於整數,轉換成整數list
例如value是Joel,那么輸出將是[u’J’,u’o’,u’e’,u’l’];value是123,那么輸出將是[1,2,3]
(30)pluralize
使用形式:{{value | pluralize}},或者{{value | pluralize:”es”}},或者{{value | pluralize:”y,ies”}}
意義:如果value不是1,則返回一個復數后綴,缺省的后綴是’s’
(31)random
使用形式:{{value | random}}
意義:從給定的list中返回一個任意的Item
(32)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
(33)safe
使用形式:{{value | safe}}
意義:當系統設置autoescaping打開的時候,該過濾器使得輸出不進行escape轉換
(34)safeseq
與上述safe基本相同,但有一點不同的就是:safe是針對字符串,而safeseq是針對多個字符串組成的sequence
(35)slice
使用形式:{{some_list | slice:”:2”}}
意義:與python語法中的slice相同,:2表示第一的第二個元素
(36)slugify
使用形式:{{value | slugify}}
意義:將value轉換成小寫形式,同事刪除所有分單詞字符,並將空格變成橫線
例如:如果value是Joel is a slug,那么輸出將是joel-is-a-slug
(37)stringformat
這個不經常用,先不說
{{ value|stringformat:”E” }}
If value is 10, the output will be 1.000000E+01.
(38)striptags
使用形式:{{value | striptags}}
意義:刪除value中的所有HTML標簽
(39)time
使用形式:{{value | time:”H:i”}}或者{{value | time}}
意義:格式化時間輸出,如果time后面沒有格式化參數,那么輸出按照TIME_FORMAT中設置的進行。
(40)title
轉換一個字符串成為title格式。
(41)truncatewords
使用形式:{{value | truncatewords:2}}
意義:將value切成truncatewords指定的單詞數目
例如,如果value是Joel is a slug 那么輸出將是:Joel is …
(42)truncatewords_html
使用形式同(41)
意義:truncation點之前如果某個標簽打開了,但是沒有關閉,那么在truncation點會立即關閉。
因為這個操作的效率比truncatewords低,所有只有在value是html格式時,才考慮使用。
(43)upper
轉換一個字符串為大寫形式
(44)urlencode
將一個字符串進行URLEncode
(45)urlize
意義:將一個字符串中的URL轉化成可點擊的形式。
使用形式:{{ value | urlize }}
例如,如果value是Check out www.djangoproject.com,那么輸出將是:
Check out <a
href=”http://www.djangoproject.com”>www.djangoproject.com</a>
(46)urlizetrunc
使用形式:{{ value | urlizetrunc:15}}
意義:與(45)相同,但是有一點不同就是現實的鏈接字符會被truncate成特定的長度,后面以…現實。
(47)wordcount
返回字符串中單詞的數目
(48)wordwrap
使用形式:{{value | wordwrap:5}}
意義:按照指定的長度包裝字符串
例如,如果value是Joel is a slug,那么輸出將會是:
Joel
is a
slug
(49)timesince
使用形式:{{value |
since:arg}}
意義:返回參數arg到value的天數和小時數
例如,如果 blog_date 是一個日期實例表示 2006-06-01 午夜, 而 comment_date 是一個日期實例表示 2006-06-01 早上8點,
那么 {{ comment_date|timesince:blog_date }} 將返回 “8 hours”.
(50)timeuntil
使用形式:{{value | timeuntil}}
意義:與(50)基本相同,一個不同點就是,返回的是value距離當前日期的天數和小時數。
#實例: #value1="aBcDe" {{ value1|upper }}<br> ABCDE #value2=5 {{ value2|add:3 }}<br> 8 #value3='he llo wo r ld' {{ value3|cut:' ' }}<br> helloworld #import datetime #value4=datetime.datetime.now() {{ value4|date:'Y-m-d' }}<br> 2018-05-11 #value5=[] {{ value5|default:'空的' }}<br> 空的 # 如果前面的值為空,則顯示default中的內容 #value6='<a href="#">跳轉</a>' {{ value6 }} # 前端顯示<a href='#'>跳轉</a> 這是一種安全機制 {% autoescape off %} # 范圍取消安全機制 {{ value6 }} # 這會顯示正常的a標簽 {% endautoescape %} {{ value6|safe }}<br> # 與上面的方法一樣,不是范圍而已 {{ value6|striptags }} 跳轉 # 取消所有html標簽 #value7='1234' {{ value7|first }}<br> 1 # 取第一個 {{ value7|length }}<br> 4 # 取長度 {{ value7|slice:":-1" }}<br> 4321 # 切片 #value8='http://www.baidu.com/?a=1&b=3' {{ value8|urlencode }}<br>
# value = 'CPTTTTTTTTTTTT'
{{ value|truncatechars:
3
}}
# 那么輸出的時候,會輸出'CPT'
2、標簽 {% tag %}
(1) {%if 條件%}
執行的代碼
{%elif 條件%}
執行的代碼
{%else%}
執行的代碼
{%endif%}
(2) {%for 變量 in 對象%} {%for 變量 in 對象 reversed%} : 同樣,{% for %}模板標簽也可使用reversed反向迭代列表
循環的代碼
{%empty%}
為空時的代碼
{%endfor%}
#系統不支持中斷循環,系統也不支持continue語句,{% for %}標簽內置了一個forloop模板變量,
#這個變量含有一些屬性可以提供給你一些關於循環的信息
1,forloop.counter表示循環的次數,它從1開始計數,第一次循環設為1: {% for item in todo_list %} <p>{{ forloop.counter }}: {{ item }}</p> {% endfor %} 2,forloop.counter0 類似於forloop.counter,但它是從0開始計數,第一次循環設為0 3,forloop.revcounter 將forloo9p的值倒過來 4,forloop.revcounter0 類似於forloop.reccouter,最后一次循環設為0 5,forloop.first當第一次循環時值為True,在特別情況下很有用: {% for object in objects %} {% if forloop.first %}<li class="first">{% else %}<li>{% endif %} {{ object }} </li> {% endfor %} # 富有魔力的forloop變量只能在循環中得到,當模板解析器到達{% endfor %}時forloop就消失了 # 如果你的模板context已經包含一個叫forloop的變量,Django會用{% for %}標簽替代它 # Django會在for標簽的塊中覆蓋你定義的forloop變量的值 # 在其他非循環的地方,你的forloop變量仍然可用
(3) {%csrf_token%} (post提交時生效)
用於生成csrf_token的標簽,用於防治跨站攻擊驗證。注意如果你在view的index里用的是render_to_response方法,不會生效
其實,這里是會生成一個input標簽,和其他表單標簽一起提交給后台的。
(4){% url %}: 引用路由配置的地址別名(參考urls.py)
(5){% with %}:用更簡單的變量名替代復雜的變量名
with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %} # 使用total變量名代替fhjsaldfhjsdfhlasdfhljsdal變量名
(6){% verbatim %}: 禁止render
{% verbatim %}
{{ hello }} # 頁面直接顯示{{ hello }}
{% endverbatim %}
(7) {% load %}: 加載標簽庫
{% load staticfiles %} 加載靜態文件
{% load xxx %} 加載自定義的filter
自定義filter和tag
1、在app中創建名稱為templatetags的包(必須的)
2、在里面創建任意 .py 文件,如:my_tags.py
3、寫my_tags.pyfrom django import template
from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改變 @register.filter # 自定義的filter def filter_multi(v1,v2): return v1 * v2 @register.simple_tag # 自定義的tag def simple_tag_multi(v1,v2): return v1 * v2 @register.simple_tag # 自定義的tag def my_input(id,arg): result = "<input type='text' id='%s' class='%s' />" %(id,arg,) return mark_safe(result)
4、在模板中調用自己寫的filter
{% load my_tags%}
# num=12
{{ num|filter_multi:2 }} #24 {{ num|filter_multi:"[22,333,4444]" }} {% simple_tag_multi 2 5 %} 參數不限,但不能放在if for語句中 {% simple_tag_multi num 5 %}
# filter可以用在if等語句后,simple_tag不可以
注意:在settings中的INSTALLED_APPS配置當前app,不然django無法找到自定義的simple_tag.
3、 {% include %}
該標簽允許在(模板中)包含其它的模板的內容。 標簽的參數是所要包含的模板名稱,可以是一個變量,也可以是用單/雙引號硬編碼的字符串。 每當在多個模板中出現相同的代碼時,就應該考慮是否要使用 {% include %} 來減少重復。
{% include 'test.html' %}
4、模板的繼承
第一步是定義 基礎模板,該框架之后將由子模板所繼承。 以下是我們目前所講述范例的基礎模板:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<h1>My helpful timestamp site</h1>
{% block content %}{% endblock %}
{% block footer %}
<hr>
<p>Thanks for visiting my site.</p>
{% endblock %}
</body>
</html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <h1>My helpful timestamp site</h1> {% block content %}{% endblock %} {% block footer %} <hr> <p>Thanks for visiting my site.</p> {% endblock %} </body> </html>
這個叫做 base.html 的模板定義了一個簡單的 HTML 框架文檔,我們將在本站點的所有頁面中使用。 子模板的作用就是重載、添加或保留那些塊的內容。 (如果你一直按順序學習到這里,保存這個文件到你的template目錄下,命名為 base.html .)
我們使用模板標簽: {% block %} 。 所有的 {% block %} 標簽告訴模板引擎,子模板可以重載這些部分。 每個{% block %}標簽所要做的是告訴模板引擎,該模板下的這一塊內容將有可能被子模板覆蓋。
現在我們已經有了一個基本模板,我們可以修改 current_datetime.html 模板來 使用它:
{% extends "base.html" %} {% block title %}The current time{% endblock %} {% block content %} <p>It is now {{ current_date }}.</p> {% endblock %}
{% extends "base.html" %} {% block title %}The current time{% endblock %} {% block content %} <p>It is now {{ current_date }}.</p> {% endblock %}
再為 hours_ahead 視圖創建一個模板,看起來是這樣的:
{% extends "base.html" %} {% block title %}Future time{% endblock %} {% block content %} <p>In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p> {% endblock %}
{% extends "base.html" %} {% block title %}Future time{% endblock %} {% block content %} <p>In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p> {% endblock %}
看起來很漂亮是不是? 每個模板只包含對自己而言 獨一無二 的代碼。 無需多余的部分。 如果想進行站點級的設計修改,僅需修改 base.html ,所有其它模板會立即反映出所作修改。
<1>如果在模板中使用 {% extends %} ,必須保證其為模板中的第一個模板標記。 否則,模板繼承將不起作用。
<2>一般來說,基礎模板中的 {% block %} 標簽越多越好。 記住,子模板不必定義父模板中所有的代碼塊,因此 你可以用合理的缺省值對一些代碼塊進行填充,然后只對子模板所需的代碼塊進行(重)定義。 俗話說,鈎子越 多越好。
<3>如果發覺自己在多個模板之間拷貝代碼,你應該考慮將該代碼段放置到父模板的某個 {% block %} 中。 如果你需要訪問父模板中的塊的內容,使用 {{ block.super }}這個標簽吧,這一個魔法變量將會表現出父模 板中的內容。 如果只想在上級代碼塊基礎上添加內容,而不是全部重載,該變量就顯得非常有用了。
<4>不允許在同一個模板中定義多個同名的 {% block %} 。 存在這樣的限制是因為block 標簽的工作方式是雙向的。 也就是說,block 標簽不僅挖了一個要填的坑,也定義了在父模板中這個坑所填充的內容。如果模板中出現了兩個 相同名稱的 {% block %} 標簽,父模板將無從得知要使用哪個塊的內容。