模板简介
将页面的设计和python的代码分离开会更干净简洁更容易维护。我们可以使用Django的模板系统来实现这种模式
python的模板:HTML代码+模板语法
模板包括在使用时会被值替换掉的变量,和控制模板逻辑的标签
变量
在Django模板中遍历复杂数据结构的关键是句点字符
{#语法#} {{ var_name }}
views
1def index(request): 2 import datetime 3 s='hello' 4 l=[1,2,3] 5 dic={"name":'lary',"age":18} 6 date = datetime.date(2000,3,12) 7 8 class Person(object): 9 def __init__(self,name): 10 self.name = name 11 12 person_l=Person("lily") 13 person_j=Person('jerry') 14 person_t=Person('tom') 15 16 person_li=[person_l, person_j, person_t] 17 18 return render(request,'index.html',{"l":l,"dic":dic,"date":date,"person_list":person_li,"s":s})
template
1<body> 2<h4>{{ s }}</h4> 3<h4>{{ l.0 }}</h4> 4<h4>{{ dic.name }}</h4> 5<h4>{{ date.year }}</h4> 6<h4>{{ person_list.0.name}}</h4> 7{#句点符也可以用来引用对象的方法(无参数方法)#} 8<h4>{{ dic.name.upper }}</h4>
模板之过滤器
语法
{{obj|filter_name:param}}
default
如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值
{{value|default:"nothing"}}
length
返回值的长度。它对字符串和列表都起作用
{{value|length}}
filesizeformat
将值格式化为一个可读的文件尺寸
{{value|filesizeformat}}
date
1{#如果value=datetime.datetime.now()#} 2{{value|date:"Y-m-d"}}
slice
1{#如果value="hello world"#} 2{{value|slice:"2:-1"}}
truncatechars
如果字符串多于指定的字符数量,那么会被截断。截断的字符串将以省略号(“...”)结尾
{{value|truncatechars:9}}
safe
Django模板中会对HTML标签和js等语法进行自动转义,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,为了在Django中关闭HTML的自动转义的两种方式,如果是一个单独的变量可以通过"|safe"的方式告诉Django这段代码是安全的不必转义
1value="<a href="">点击</a>" 2{{value|safe}}
autoescape
控制当前的自动转义行为,此标记采用on或者off作为参数,并确定自动转义是否在块内有效。该块以endautoescape结束标签关闭
1def generate_report(request): 2 report_name = "this is a test report" 3 report_tilte = "<h1>this is a title</h1>" 4 return render(request, 'report.html', locals())
开启转义
1{% autoescape on %} 2{{ report_title }} 3{% endautoescape %}
关闭转义,默认该语句块中的内容是安全的
1{% autoescape off %} 2{{ report_title }} 3{% endautoescape %}
模板之标签
标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到额外信息到模板中,一些变迁需要开始和结束标签
for标签
1{#遍历每一个元素#} 2<h4>{{ dic.name.upper }}</h4> 3{% for person in person_list %} 4<p>{{ person.name }}</p> 5{% endfor %} 6 7{#遍历字典#} 8{% for key,val in dic.items %} 9 <p>{{ key }}:{{ val }}</p> 10{% endfor %} 11 12{#循环序号#} 13{{forloop.counter}}
for...empty
for标签带有一个可选的{% empty%}从句,以便在给出的组是空的或者没有被找到时,可以有所操作
1{#for empty#} 2{% for person in person_list %} 3 <p>{{ person.name }}</p> 4 {% empty %} 5 <p>sorry,no person here</p> 6{% endfor %}
if标签
if标签会对一个变量求值,如果它的值是true,对应的内容块会输出
1{#if标签#} 2{% if num > 100 or num < 0 %} 3 <p>无效</p> 4{% elif num > 80 and num < 100 %} 5 <p>优秀</p> 6{% else %} 7 <p>一般</p> 8{% endif %}
with
使用一个简单的名字缓存一个复杂的变量,当你需要使用一个方法很多次的时候是非常有用的
1{#with标签#} 2{% with total=business.employees.count %} 3 {{ total}}employee{{ tatal|pluralize }} 4{% endwith %}
csrf_token
这个标签用于跨站请求伪造保护
1{#csrf_token#} 2{% csrf_token %}
自定义标签和过滤器
在settings中的INSTALLED_APPS配置当前app
在app中创建templatetags模块
创建任意.py文件,如my_tags.py
1from django import template 2from django.utils.safestring import mark_safe 3 4register = template.Library() 5 6@register.filter 7def filter_multi(x,y): 8 return x*y 9 10@register.simple_tag 11def simple_tag_multi(x,y): 12 return x*y 13 14@register.simple_tag 15def my_input(id,args): 16 result="<input type='text' id='%s' class='%s'/>"%(id,args,) 17 return mark_safe(result)
在使用自定义simple_tag和fileter的html文件中导入之前创建的my_tag.py
{% load my_tag %}
使用simple_tag和filter
1{{ num|filter_multi:2 }} 2{{ num|filter_multi:"[22,33,444]" }} 3{#参数不限,但不能放在if for语句中#} 4{% simple_tag_multi 2 5 %} 5{% simple_tag_multi num 5 %} 6 7{#filter可以用在if等语句后,simple_tag不可以#} 8{% if num|filter_multi:30 > 100 %} 9 {{ num|filter_multi:30 }} 10{% endif %}