前面学习了Django的下载和基础的操作,掌握了其基本框架,接下来我们来学习Django中的模板语法。
学习任务:知道什么是模板,以及html+模板语法的具体用法
python的模板:HTML代码+模板语法
模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的标签。
#原始的视图 def timeHandle(request): import datetime t=datetime.datetime.now() #Django修改后的视图 # 方式1: # return HttpResponse("<h1>%s</h1>"%str(t)[:19]) # 方式2: from django.template import Template, Context templateobj=Template("<h2 style=‘color:red‘>current time:{{time}}</h2>") contextobj=Context({"time":str(t)}) html=templateobj.render(contextobj) return HttpResponse(html) #方式3 # return render(request,"time.html",{"time":str(t)[:19]})
模板语法之变量
在 Django 模板中遍历复杂数据结构的关键是句点字符 .
具体实例如下:
views:
def index(request): name=‘I am dreaming‘ #字符串 i=100 l=[111,222,333] #列表 dic={‘name‘:‘yuan‘,‘age‘:18} #字典 class Anminal(object): def __init__(self, name, color): self.name = name self.color = color def __str__(self): return self.name + str(self.color) def run(self): return ‘is running‘ Anminal_dog1 = Anminal(‘拉布拉多1‘, ‘黑色‘) Anminal_dog2 = Anminal(‘拉布拉多2‘, ‘黑色‘) Anminal_dog3 = Anminal(‘拉布拉多3‘, ‘黑色‘) AnminalList = [Anminal_dog1, Anminal_dog2, Anminal_dog3] msg=[] #空列表 label = "<a href=‘‘>点击</a>" return render(request,‘index.html‘,locals()) # return render(request,‘index.html‘,{‘name‘:name,‘i‘:i,‘l‘:l,‘dic‘:dic,‘Anminal_dog1‘:Anminal_dog1,‘Anminal_dog2‘:Anminal_dog2,‘Anminal_dog3‘:Anminal_dog3,‘AnminalList‘:AnminalList})
templates:
<p>{{ name }}</p> <p>{{ name| length }}</p> <p>{{ name|slice:‘5:‘ }}</p> <p>{{ i }}</p> <p>{{ l }}</p> <p>{{ l|length }}</p> <p>{{ dic}}</p> <p>{{ Anminal_dog1.name}}</p> <p>{{ Anminal_dog1.color}}</p> <p>{{ Anminal_dog3.run }}</p> <p>{{ AnminalList }}</p> <hr> {% for foo in AnminalList reversed%} <p>{{ foo }}</p> {% endfor %} <hr> {{ msg|default:"" }} <p>--------->{{ content|truncatechars:20 }}</p> <p>{{ content|truncatewords:5 }}</p>
模板之过滤器
语法:{{obj|filter__name:param}}
default
如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
{{ value|default:"nothing" }}
length
返回值的长度。它对字符串和列表都起作用。例如:
{{ value|length }}
filesizeformat
将值格式化为一个 “人类可读的” 文件尺寸 (例如 ‘13 KB‘
, ‘4.1 MB‘
, ‘102 bytes‘
, 等等)。例如:
{{ value|filesizeformat }}
如果 value
是 123456789,输出将会是 117.7 MB
。
date
如果value=datetime.datetime.now()
{{ value|date:"Y-m-d" }}
slice
如果 value="hello world"
{{ value|slice:"2:-1" }}
truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:要截断的字符数
例如:
{{ value|truncatechars:9 }}
如果value是“Joel 是 a >,输出将为“Joel i ...”。
safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如:
value="<a href="">点击</a>" {{ value|safe}}
模板之标签
标签看起来像是这样的: {% tag %}
。标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。
一些标签需要开始和结束标签 (例如{% tag %} ...
标签 内容 ... {% endtag %})。
for标签
遍历每一个元素:
{% for person in person_list %} <p>{{ person.name }}</p> {% endfor %}
可以利用{% for obj in list reversed %}反向完成循环。
遍历一个字典:
{% for key,val in dic.items %} <p>{{ key }}:{{ val }}</p> {% endfor %}
自定义模板和过滤器
具体步骤如下:
(1)在settings中的INSTALLED_APPS,是否有当前应用。
(2)在应用中创建一个templatetags
(3)在templatetags中创建py文件:mytag.py
(4)在mytag.py 中引入:
from django import template
from django.utils.safestring import mark_safe
register = template.Library() #register的名字是固定的,不可改变
(5)定义过滤器和标签
@register.filter
def multi(x,y):
return x*y
@register.simple_tag
def multiTag(x,y,z):
return x*y*z
(6)在引用模板中导入:{% load myTag %}
(7) 调用:
过滤器: {{var|filter_name:参数}} # 参数只能是一个
标签: {% simple_tag 参数1 参数2 ... %}
模板继承