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
>

