将页面的设计和Python的代码分离开会更干净简洁更容易维护。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题。
django的模板:HTML代码+模板语法:
def timer(request): import time now_time = time.time() # html = "<html><body>现在时刻:<h1>%s.</h1></body></html>" % now_time # return HttpResponse(html) return render(request,‘timer.html‘,{‘timer‘:now_time})
模板语法之变量:
在django模板中遍历复杂数据结构的关键是句点字符。
def index(request): import datetime now_time = datetime.datetime.now() l = [123,456,789] dic = {‘name‘:‘qingqiu‘,‘age‘:17} class Person: def __init__(self,name,age): self.name = name self.age = age def sing(self): return ‘唱歌...‘ p1 = Person(‘qingqiu‘,17) p2 = Person(‘xiaobai‘,17) person_list = [p1,p2] return render(request,‘index.html‘,{‘timer‘:now_time,‘l‘:l,‘dic‘:dic,‘person_list‘:person_list})
views.py
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>hello</h3> <p>{{ timer }}</p> <p>{{ timer.strptime }}</p> <p>{{ l }}</p> <p>{{ l.0 }}</p> <p>{{ l.1 }}</p> <p>{{ l.2 }}</p> <p>{{ dic }}</p> <p>{{ dic.name }}</p> <p>{{ dic.age }}</p> <p>{{ person_list }}</p> <p>{{ person_list.0.name }}</p> <p>{{ person_list.0.age }}</p> <p>{{ person_list.1.name }}</p> <p>{{ person_list.1.age }}</p> <p>{{ person_list.1.sing }}</p> </body> </html>
template.index
模板之过滤器:
语法:{{ obj | filter_name:param }}
1,default:
{{ obj|default:‘没有参数‘ }}
如果一个变量是false或者为空,则使用给定的默认值,否则,使用变量的值。
2,length
{{ obj|length }}
返回值的长度,它对字符串和列表都起作用。
3,filesizeformat:
将值(整形)格式化为一个文件大小。
4,date
{{ value|date:"Y-m-d"
}}
如果 value = datetime.datetime.now()
5,slice
{{ value | slice : 起始位置:结束位置:步长 }}
6,truncatechars
{{ value|truncatechars:6
}}
数字是加上3(省略号)的总值。
如果字符串字符多于指定的字符串数量,那么会被截断,阶段的字符串将以可翻译的省略号序列(‘...’)结尾。
7,safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如:
value = "<a href = ‘http://www.baidu.com‘>click</a>"
{{ value|safe}}
最好在href中写上绝对地址,否则它会在你原有的地址后面加上你的href连接。
8,add
{{ value|add:100}}
模板之标签:
for标签:
遍历每一个元素:
{% for person in person_list %} <p>{{ person.name }}</p> {% endfor %}
可以利用{% for obj in list reversed %}反向完成循环。
注:循环序号可以通过{{forloop}}显示
forloop.counter 从1开始排序 forloop.counter0 从0开始排序 forloop.revcounter 倒序,最后一个为1 forloop.revcounter0 倒序,最后一个为0 forloop.first 如果是第一次遍历返回true,否则返回false forloop.last 如果是最后一次遍历返回true,否则返回false
for ... empty
for 标签带有一个可选的{{ % empty %}} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。
{% for person in person_list %} <p>{{ person.name }}</p> {% empty %} <p>sorry,no person here</p> {% endfor %}
if 标签:
{% if 条件 %} 会对一个变量求值,如果它的值是True,(存在,不为空,且不是boolean类型的false值),对应的内容会输出。
{% if num > 100 %} <p>大于100</p> {% elif num < 100 %} <p>小于100</p> {% else %} <p>等于100</p> {% endif %}
for 和 if 搭配使用:
{% endfor %} <hr> {% for person in person_list %} <span>{{ person.name }}</span> {% if not forloop.last %} , {% endif %} {% endfor %} # 清秋,小白 以逗号隔开
with 标签:
使用一个简单的名字缓存一个复杂的变量,当你需要使用一个繁琐的方法(比如访问数据库)很多次的时候是非常方便的。
简而言之就是起一个别名,方便调用。
例如: {% with p1=person_list.0 %} <p>{{ p1.name }},{{ p1.age }}</p> {% endwith %}
第二种方法:
{% with person_list.0 as p1 %} <p>{{ p1.name }},{{ p1.age }}</p> {% endwith %}
crsf_taken
这个标签用于跨站请求伪造保护。
原文地址:https://www.cnblogs.com/stfei/p/9226518.html