将页面的设计和 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 person in person_list %}
- <p>{{ person.name }}</p>
- {% endfor %}
- forloop.counter 从 1 开始排序
- forloop.counter0 从 0 开始排序
- forloop.revcounter 倒序, 最后一个为 1
- forloop.revcounter0 倒序, 最后一个为 0
- forloop.first 如果是第一次遍历返回 true, 否则返回 false
- forloop.last 如果是最后一次遍历返回 true, 否则返回 false
- for ... empty
- {% for person in person_list %}
- <p>{{ person.name }}</p>
- {% empty %}
- <p>sorry,no person here</p>
- {% endfor %}
- {% if num> 100 %}
- <p > 大于 100</p>
- {% elif num <100 %}
- <p > 小于 100</p>
- {% else %}
- <p > 等于 100</p>
- {% endif %}
- {% endfor %}
- <hr>
- {% for person in person_list %}
- <span>{{ person.name }}</span>
- {% if not forloop.last %}
- ,
- {% endif %}
- {% endfor %}
- # 清秋, 小白 以逗号隔开
- 例如:
- {% 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
来源: http://www.bubuko.com/infodetail-2659509.html