Django学习【第3篇】:Django 之模板语法
Django框架之第三篇模板语法(重要!!!)
一.什么是模板?
只要是在html里面有模板语法就不是html文件内容了,这样的文件就叫模板。
二.模板语法分类
一.模板语法之变量:{{ }}:
在 Django 模板中遍历复杂数据结构的关键是句点字符. (也就是点)

1 def index(request): 2 name = "hello haiyan" 3 i = 200 4 l = [11,22,33,44,55] 5 d = {"name":"haiyan","age":20} 6 7 class People(object): #继承元类 8 def __init__(self,name,age): 9 self.name = name 10 self.age = age 11 def __str__(self): 12 return self.name+str(self.age) 13 def dream(self): 14 return "你有梦想吗?" 15 #实例化 16 person_egon = People("egon",10) 17 person_dada = People("dada",34) 18 person_susan = People("susan",34) 19 person_list = [person_dada,person_egon,person_susan] 20 21 return render(request,"index.html", 22 { 23 "name":name, 24 "i":i, 25 "l":l, 26 "d":d, #键对应的是模板里的名字。值对应的是上面定义的变量 27 "person_egon":person_egon, 28 "person_dada":person_dada, 29 "person_list":person_list, 30 } 31 ) 32 # return render(request,"index.html",locals()) 33 #用locals()可以不用写上面的render了。不过用locals(),views里面用什么名。模板里面就得用什么名 34 # locals()局部的:用了locals就相当于都得按照上面的那样

1 <h4>变量{{ z }}:深度查询</h4><hr> 2 <h3>{{ name }}</h3> 3 <p>{{ i }}</p> 4 <p>{{ l }}</p> 5 <p>{{ d }}</p> 6 <p>{{ l.0 }}------》取单个值可通过句点符(也就是点)</p> 7 <p>{{ l.4 }}</p> 8 <p>{{ d.name }}</p> 9 <p>{{ d.age }}-----》字典也可以根据句点符取值,一个点就搞定了。 10 然而在前端页面中是看不到你的模板语法的,当你点击审查元素的 11 时候,你就会发现,偷偷的换过来了</p> 12 <p>{{ person_dada.name }}</p> 13 <p>{{ person_egon.age }}</p> 14 <p>{{ person_dada.dream }}</p> <!-- .方法的时候,注意当前的dream方法是没有参数的--> 15 <p>{{ person_list.2 }}</p> <!--单个取值--> 16 <p>{{ person_list.1.name }}</p> 17 <!-- 那怎么让对象变成字符串呢?在index视图函数里里面再加上一个__str__内置方法--> 18 <!--__str__是对象字符串的改变-->
注意:句点符也可以用来引导对象的方法(无参数方法)。
<h4> 字典:{{ dic.name.upper }} </h4>
二.模板语法之标签: 语法为 {% tag %}:
标签看起来像是这样的{% tag %}. 标签比变量更加复杂:一些在输出中创造文本,一些通过逻辑控制流程,一些加载其后的变量将使用额外的信息加载到模板中。
一些标签需要开始和结束标签,例如 {% tag %} ... 标签 内容 ... {% tag %}.
1. for标签 (注:循环序号可以通过 {{forloop}} 显示)
<h3>循环取值1</h3><hr> {% for item in person_list %} <p>{{ item.name }},{{ item.age }}</p> {% endfor %} <h3>循环取值2:倒序</h3><hr> {% for item in person_list reversed %} <!--序号从1开始--> <p>{{ forloop.counter }}----->{{ item.name }},{{ item.age }}</p> <!--序号从0开始--><p>{{ forloop.counter0 }}----->{{ item.name }},{{ item.age }}</p><!-- 序号倒序 --><p>{{ forloop.revcounter }}----->{{ item.name }},{{ item.age }}</p> {% endfor %} <h3>循环取值3:字典</h3><hr> {% for k,v in d.items %} <p>{{ k }},{{ v}}</p> {% endfor %}
2. for ...empty :for 标签带有一个可选的 {% empty %} 从句,以便给出的组是空的,或者是没有找到时,可以进行操作。
{% for person in person_list %} <p> {{person.name}} </p> {% empty %} <p>{{sorry,no person here </p> {% endfor %}
3. if标签 : {% if %}
会对一个变量求值,如果它的值时"True" (存在,不为空,且不是boolean类型的false值),对应的内容块会输出。
{% if i > 300 %} <p>大于{{ i }}</p> {% elif i == 200 %} <p>等于{{ i }}</p> {% else %} <p>小于{{ i }}</p> {% endif %}
4.with:使用一个简单的名字缓存一个复杂的变量,当你需要一个“昂贵”的方法(比如使用数据库)很多次的时候是非常有用的
{% with total=business.employees.count %} {{ total }} employee {{ total|pluralize }} {% endwith %} <p> {{ person_list.2.name }}</p> {% with name=person_list.2.name %} <p>{{ name}}</p> {% endwith %}
5. csrf_token:这个标签用于跨站请求伪造保护
提交数据的时候就会在安全机制,当你点击提交的时候就会出现一个forbbiddon的错误,就是用setting配置的scrf做安全机制的,那么我们可以把它给注释了,,,
或者在form表单下面添加一个{% csrf_token %},,,
这才是真正的解决办法,注释不是解决的办法
<h3> scrf_token</h3> <form action="/tag/" methon="post"> {% csrf_token %} <p> <input type="text" name="wenqiang"></p> <input type="submit"> </form>
三. 模板语法之过滤器: 语法{{obj|filter_name:param}}
1. default: 如果一个变量为flase或者为空,使用给定的默认值。否者使用变量的值。
<p> default 过滤器:{{li|default:"如果显示为空,设置的解释性内容“}}</p>
2. length: 返回值的长度。它对字符串和列表都起作用。
{{value|length}} 如果value是["a","b","c","d"],那么输出的是4
3.filessizeformat : 将值格式化为一个”人类易读的“文件尺寸(例如:"15bytes","12KB","4.1MB",等等)
{{ value|filesizeformat}}
如果value是123456789,输出将会输出是117.7MB
4.date:如果 value=datatime.datetime.now()
{{value|date:"Y-m-d H:i:s"}}
5.slice: 切片
如果value="hello world" {{value|slice:"2:-1"}}
对value进行切片操作
6.truncatechars 截断
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数: 要截断的字符数
<p> 截断字符:{{content|truncatechars:20}}</p> <p>截断单词:{{content|truncatewoeds:4}}</p> 如果content是"I am wenqiang,how are you qwertyuiopertyuio?" 输出结果:截断字符:I am wenqiang,how... 输出结果:截断单词:I am wenqiang,how are...
7.safe
Django的模板中会对HTML和JS等语法标签进行自动转义,原因就是为了安全。但是有些时候,我们不希望HTML被转义,比如我们做一个内容管理系统,后台添加的文章是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动退转义的话显示的就是保护HTML标签的源文件。在Django中关闭HTML自动转义有两种方式:
如果是一个单独的变量,我们可以通过过滤器"|safe"的方式告诉Django这段代码是安全的不必转义。
value '<a href="">点击</a>' {{ value|safe}} <p>{{ label }} </p> #为了安全,系统会把标签变成字符串 <p>{{ label|safe }}</p> #加上safe,确定你的数据是安全的,才能被当成标签
四.自定义标签和过滤器
1.在settings中的INSTALLED_APPS配置当前的app,不然django无法找到自定义的simple_tag.
2.在app中创建templatetags模块(模块名只能是templatetags)
3.在templatetags里面创建任意 .py 文件。

1 from django import template 2 from django.utils.safestring import mark_safe 3 4 register = template.Library() #register的名字是固定的,不可改变 5 @register.filter 过滤器 6 def multi(x,y): 7 return x*y 8 9 @register.simple_tag 标签 10 def multitag(x,y,z): 11 return x*y*z 12 @register.simple_tag 标签 13 def my_input(id,arg): 14 result = "<input type='text' id='%s' class='%s' />" %(id,arg,) 15 return mark_safe(result)
4.在使用自定义的simple_tag和filter (如何调用)
过滤器:{{var|filter_name:参数}} #参数有两个,一个参数是变量var,一个是参数
标签:{% simple_tag参数1 参数2 ... %}
-------------------------------.html {% load xxx %} #xxx 代表需要引入的html文件名 # num=12 {{ num|multi:2 }} #24 {{ num|multi:"[22,333,4444]" }} 相当于复制了,吧[22,333,4444]乘了num遍 {% multitag 2 5 6 %} 参数不限,但不能放在if for语句中 {% simple_tag_multi num 5 %}
自定义过滤器函数的参数只能有两个,可以进行逻辑判断,
自定义的标签无参数参数限制,不能进行逻辑判断
{% i|multi:5> 1000 %} #判断i*5>1000 <p>大于{{i}}</p> {% else %} <p>大于等于{{i}}</p> {% endif%}
