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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

