12.35 Django模板系統
{{ }}和 {% %},變量相關的用{{}},邏輯相關的用{%%}
app02/views:
# 模板語言測試函數 def template_test(request): name = " 張三 " dic = { " name " : " 張三 " , " age " : 16, " items " : " sb " } list1 = [11, 22, 33, 44, 55 ] ? class Person(object): def __init__ (self, name): self.name = name ? def dream(self): return " {}在做白日夢 " .format(self.name) p1 = Person( " 張三豐 " ) import datetime today = datetime.datetime.today() ? return render( request, " template_test.html " , { " name " : name, " dic " : dic, " list " : list1, " obj " : p1, " box " : " 黑盒子 " , " filesize " : 1234567890 , " today " : today, " str " : " " , " words " : """ 先帝創業未半而中道崩殂 """ } )
template_test.html:
{ { dic.name } } { { dic.age } } #張三 16 { { dic.items } } #Django的模板語言中屬性的優先級大于方法的優先級 sb { { obj.name } } #張三豐 { { obj.dream } } #張三豐在做白日夢 模板語言中調用綁定方法不需要加括號
12.351 過濾器
在Django的模板語言中,通過使用 過濾器 來改變變量的顯示, 過濾器的語法: {{ value|filter_name:參數 }}
使用管道符"|"來應用過濾器
例如:{{ name|lower }}會將name變量應用lower過濾器之后再顯示它的值。lower在這里的作用是將文本全都變成小寫。
template_test.html:
{ { list } } #[11, 22, 33, 44, 55] { { list.0 } } #索引取值:11 { { list|first } } # 11 { { list|length } } #返回值的長度,作用于字符串和列表 5 { { list|slice : "2:-1" } } #切片:[33,44] { { ['a','b']|join : "*" } } #"a*b" { { box|default : "空盒子" } } #如果box沒有傳值或者值為空的話就顯示默認值,否則使用變量的值 { { filesize|filesizeformat } } #格式化文件大小 1.1G { { today|date : "Y-m-d H:i:s" } } #格式化日期格式 { { str|safe } } #取消轉義,直接應用HTML標簽 { { words|truncatechars : 9 } } #字符串字符多于指定的字符數量會被截斷,截斷的字符串將以(“...”)結尾 { { words|truncatewords : 9 } } #在一定數量的字后截斷字符串,截斷的字符串將以(“...”)結尾 { { i love you|cut : ' ' } } #移除value所有的與給出的變量相同的字符串,輸出'iloveyou' { { 1|add : 1 } } # 2 #add可以數字加法,拼接字符串,拼接列表 { { name|upper } } # NAME ?
timesince:將日期格式設為自該日期起的時間(例如,“4天,6小時”),blog_date是表示2006年6月1日午夜的日期實例,并且comment_date是2006年6月1日08:00的日期實例,則以下將返回“8小時”:
{ { blog_date|timesince : comment_date } }
12.352 自定義filter
app02: __init__ .py models.py templatetags: # 在app02下面新建一個名為templatetags的(Python package)包 __init__ .py app02_filters.py # 建一個存放自定義filter的文件 views.py
編寫自定義filter:
app02_filters.py :
from django import template register = template.Library() # 生成一個用于注冊自定義filter方法的實例 ? @register.filter(name = " sb " ) def add_sb(value): return " {} sb " .format(value) ? @register.filter(name = " cut " ) def cut(value, arg): return value.replace(arg, "" )
template_test.html:
{ % load app02_filters % } # 先導入我們自定義filter那個文件 ? { { name } } #張三 { { name|sb } } #張三 sb { { name|cut : "三" } } #張
注意:
過濾器支持“鏈式”操作。即一個過濾器的輸出作為另一個過濾器的輸入。 過濾器可以接受參數,例如:{{ sss|truncatewords:30 }},這將顯示sss的前30個詞。 過濾器參數包含空格的話,必須用引號包裹起來。比如使用逗號和空格去連接一個列表中的元素, 如:{{ list|join:', ' }} ':'左右沒有空格
12.353 simple_tag
和自定義filter類似,但接收更靈活的參數
定義注冊simple_tag:文件名:app01_my_simple_tags
from django import template register = template.Library() # 生成一個用于注冊simple_tag自定義方法的實例 ? @register.simple_tag(name = " plus " ) def plus(a, b, c): return " {} + {} + {} " .format(a, b, c)
使用自定義simple_tag:
{ % load app01_my_simple_tags % } ? { % plus "1" "2" "abc" % } #"12abc"
12.354 inclusion_tag
多用于返回html代碼片段
templatetags /inclusion_tag_test.py :
from django import template register = template.Library() ? @register.inclusion_tag( ' result.html ' ) def show_results(n): n = 1 if n < 1 else int(n) data = [ for i in range(1, n+1 )] return { " data " : data} # 用字典給result.html傳值
templates/ result.html :
{ % for i in data % } { { i } } { % endfor % }
templates/index.html:
< html lang ="en" > < head > < meta charset ="UTF-8" > < meta name ="viewport" content ="width=device-width, initial-scale=1" > < title > inclusion_tag test title > head > < body > {% load inclusion_tag_test %} #導入 inclusion_tag文件 {% show_results 10 %} body > html >
12.355 Tags
for循環:
{ % for user in user_list % } { { forloop.counter } } #當前循環的索引值(從1開始) { { forloop.counter0 } } #當前循環的索引值(從0開始) { { forloop.revcounter } } #當前循環的倒序索引值(從1開始) { { forloop.revcounter0 } } #當前循環的倒序索引值(從0開始) # { % if forloop.first % } #當前循環是不是第一次循環(布爾值) { % if forloop.last % } #當前循環是不是最后一次循環(布爾值) { { user.name } } { % else % }
xxxxx <% endif %> { % empty % } #if語句都沒執行時執行empty xxxxx { % endfor % }
with: 定義一個中間變量,多用于給一個復雜的變量起別名
{ % with total=business.employees.count % } #注意等號左右不要加空格。 { { total } } employee { { total|pluralize } } { % endwith % } 或 { % with business.employees.count as total % } { { total } } employee { { total|pluralize } } { % endwith % }
for ... empty:
{ % for user in user_list % } { { user.name } } { % empty % }
空空如也 { % endfor % }
12.356 母版
新建一個HTML文件(base.html),將公用的標簽放在base.html中作為母版,其他子頁面可以繼承此母版,避免代碼的重復和多次修改
base.html:
< html lang ="en" > < head > < meta charset ="UTF-8" > < meta http-equiv ="x-ua-compatible" content ="IE=edge" > < meta name ="viewport" content ="width=device-width, initial-scale=1" > < title > Title title > {% block page-css %} {% endblock %} head > < body > {#導航條 開始#} {% include 'nav.html' %} {#導航條 結束#} < h1 > 這是母板的標題 h1 > {% block page-content %} ? {% endblock %} < h1 > 母板底部內容 h1 > {% block page-js %} ? {% endblock %} body > html >
注意:我們通常會在母板中定義頁面專用的CSS塊和JS塊,方便子頁面替換。
繼承母板:
在子頁面中在頁面最上方使用下面的語法來繼承母板:
{ % extends 'base.html' % } { % block page-content % } ..... { % endblock % }
組件:
可以將常用的頁面內容如導航條,頁尾信息等組件保存在單獨的文件中,然后在需要使用的地方按如下語法導入即可:
nav.html: 導航條
xxx.html:
< html lang ="en" > < head > < meta charset ="UTF-8" > < title > Title title > head > < body > ? {% include 'nav.html' %} #在使用時通過{% include 組件文件 %}來引入公用組件 < div class ="container" > < div class ="row" > < div class ="page-header " > < h1 class ="text-center" > 新增作者信息 h1 > < div class ="col-md-6 col-md-offset-3" > ....... div > div > div > div > body > html >
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
