来看一段代码
def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
直接把HTML页面嵌套在视图函数里返回给浏览器并不是一个好主意;
原因:
1、对页面设计进行的任何改变都必须对 Python 代码进行相应的修改,牵一发而动全身;
2、Python 代码编写和 HTML 设计是两项不同的工作,前端开发和后端开发无非 并行;
基于这些原因,将HTML页面的设计和后端逻辑设计分离,会更简洁、容易维护开发我们的WEB应用。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题。
模板是什么?
Django自带的模板语言= HTML代码+逻辑控制代码,注意 模板 != HTML,模块 =HTML代码+逻辑控制代码(特殊标记);
模板作用?
在server端 把后端的变量 嵌入到HTML中渲染后,返回给浏览器来达到前后端代码分离,页面动态显示的目的;
一、Django模板语言应用:
Django模板语言的语法主要分为2种: {{变量}} 和 {% Tag %} ,{{变量 }}主要用于和视图变量做替换,{% tag %}主要用于做逻辑判断和实现某些功能,正因有了数据+逻辑才构成了模板语言;
1.1、使用双大括号引用视图中的变量
语法:{{ 变量}} ,列表取值:{{列表. 索引}}, 字典取值:{{字典.键}}
1.2:内置变量过滤器的使用
如果引用得视图变量,不能直接渲染使用,可以借助fifter进行数据的二次处理,就像Python中的内置函数;
语法:{{ 变量|fifter:参数 }}
过滤器列表:
- add:给变量加上相应的值、
- addslashes :单引号加上转义号,一般用于输出到javascript中
- capfirst :第一个字母大写
- {{ "123spam456spam789"|cut:"spam" }}查找删除指定的字符串
- {{ l1|slice:":2" }} 列表切边
- {{ t|date:'Y-m-d' }} 转换特定时间格式
- {{ s|default:'空空如也' }} 值不存在,使用指定值
- {{ info|truncatechars:18 }} 渲染指定长度的字符
- {{ info1|truncatewords:9 }}渲染指定长度的单词
- {{ a|safe }} 声明安全可以渲染
实例
视图
from django.shortcuts import render import datetime def fifters(request): i=10 w="A'B'C'D'E" f='china' t=datetime.datetime.now() s='' l1=[98890,765,9870,7654] info='嘲笑我吧你们这些毫无眼光的人,我必将引来雷霆万钧的力量,摧古拉朽得战胜一切敌人!' info1='You laugh at me without the vision of people, and I will lead to an irresistible force power, corruption must defeat all enemies destroy gura!' li=['a','b','c','d','e','f','g'] str1='{{hello world}}' a='<a href="黄色网址">点击我</a>' fhjsaldfhjsdfhlasdfhljsdal='hellow world' return render(request,'modals.html',locals())
模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模板渲染</title> </head> <body> <p>{{ i|add:200 }}</p> <p>{{ w|addslashes}}</p> <p>{{ f|capfirst }}</p> <p>{{ "123spam456spam789"|cut:"spam" }}</p> <p>{{ t|date:'Y-m-d' }}</p> <p>{{ l1|slice:":2" }}</p> <p>{{ s|default:'空空如也' }}</p> <p>{{ info|truncatechars:18 }}</p> <p>{{ info1|truncatewords:9 }}</p> <p> {% csrf_token%} {% for foo in li %} <li>{{ forloop.counter0 }}----->{{ foo }}</li> {% empty %} <li>没有符合的对象</li> {% endfor %} </p> <p> <p>{{ a|safe }}</p> </body> </html>
2.1、内置标签(tag)的使用
如果引用到了视图中的变量,还不足以渲染出一个完美的页面,那就要借助tag标签,做逻辑控制和功能完善了;
语法格式: {% tags %}
{% for %} {% endfor %} for循环
{% for row in list %} </tr> <td>{{ row.id }}</td> <td>{{ row.name }}</td> <td>{{ row.title }}</td> <td><a href="#" onclick="show_modal(this)">添加</a></td> <td id="del_s"><a href="#" onclick="modal_del(this)">删除</a> </td> <td><a href="#"onclick="modal_edit(this)">编辑</a></td> </tr> {% endfor %}
{% if %}{% endfor %} if判断
基本语法格式如下:
{% if condition %}
... display
{% endif %}
或者:
{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}
<select name="class_id" id=""> {% for row in dict %} {% if row.id == name1.class_id %} <option selected value="{{ row.id }}">{{ row.title}}</option> {%else%} <option value="{{ row.id }}">{{ row.title}}</option> {%endif%} {% endfor %} </select>
{% if row.id in cids%} in 成员关系判断
<p>任教课程: <select name="class_id" multiple size="5"> {% for row in clas %} {% if row.id in cids%} <option selected value={{ row.id}}>{{ row.title}}</option> {%else%} <option value={{ row.id}}>{{ row.title}}</option> {% endif %} {% endfor %} </select> </p>
{% empty %} 没有渲染到数据,提示。
{% for foo in li %} <li>{{ forloop.counter0 }}----->{{ foo }}</li> {% empty %} <li>没有符合的对象</li> {% endfor %}
{% verbatim %}{% endverbatim %} 禁止渲染
视图
str1='{{hello world}}'
模板
{% verbatim %}
{{ str1 }}
{% endverbatim %}
{% csrf_token %}
用于生成csrf_token的标签,用于防治跨站攻击验证(csrf)。 其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的。
{% url %} 引用路由分配系统配置的 path 别名
<form action="{% url "bieming"%}" > <input type="text"> <input type="submit"value="提交"> {%csrf_token%} </form>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>{{args}}</p> <p>{% url "zhangge" i i1%}</p> </body> </html>
二、自定义fifter和simp-tag
模板语言自带的tag和过滤器,在某些情况下还不能满足我的功能需求,例如无法实现递归显示需求等,可以自定义fifter和tag;就像Python内置函数和自定义函数关系;
1、在app中创建 templatetags目录或Python包(必须名为 templatetags)
2、templatetags文件夹下随便创建个Python文件,自定义函数;
from django import template register =template.Library() #模板过滤器{{变量|myupper}},最少带一个参数,最多带两个, @register.filter() def myupper(myname,pstr): return myname.upper()+pstr #自定义的函数.参数没有限制,模板已空格的形式表示一个参数 @register.simple_tag() def myfun(nid,sid,pid): return nid+sid+pid
3、注册到setings.py文件里
4、加载到模板里
{% load fun %} <!doctype html> <html> <head>
5、引用到模板
{{myname|myupper:'abc'}}
{% myfun 'abc' '321' '456' %}
6、自定义fifter和simp-tag 区别
1、simple-fifter
优点:支持iif else 条件判断
{% if i|mutil:20 > 100 %} <p>大于</p> {% else %} }} <p>小于</p> {% endif %}
缺点:simple-fifter类型的函数只支持2两个参数
2、simple-tag
优点:simple-fifter类型 无限制传参
{% mutil2 78 90 20 %} #参数无限制
缺点:不支持iif else 条件判断