Django之模板
1.为什么使用模板系统
Django模板用来分离文档的展现和数据。为什么要分离展现和设计?因为Html页面改动频繁,就必然牵涉到python代码的改动,此外,两者分离会更加高效,减少等待时间。
模板本质是html文档,但中间有变量{{}}和模板标签{%%}
2.模板渲染符号
变量相关的用{{}},逻辑相关的用{%%}。
{{变量名}},包围的是变量,如{{person_name}},表示给定变量值的插入。
{%tag%},包围的是块标签。如{%if.... %} 它告诉模板做些事情。
3.变量
在视图函数中,通过render方法将数据传给templates下的html文件。
render(request,’’login.html’’,{“变量1”:变量1,”变量2”:变量2,})
通过字典的形式传值。字典处可以些locals(),代表将所有变量都传过去。测试时可以用,实际不用,而且效率低。传的值包括字典、列表、对象等
在html中,直接写{{变量名}}调用。如果传来的是列表、字典,可以直接用.(点)的方式+索引(键)来取里面的值。比如{{dict.name}},{{list.0}}。在调用对象里面的方法的时候,不需要写括号来执行,并且只能执行不需要传参数的方法
4.过滤器
(1)过滤器介绍
过滤器用途:改变变量的显示。如{{value|filesizeformat}}表示将传来的值格式化一个可读的文件尺寸(如KB,MB等)
过滤器语法:{{ value|filter_name:参数 }}
|是管道符。参数一般用双引号包裹。比如:{{bio|truncatewords:”30”}}表示显示bio变量的前30个字。
注意事项:'|'左右没有空格没有空格没有空格。过滤器参数包含空格的话,必须用引号包裹起来。
(2)几个过滤器介绍
名称 |
用法 |
解释 |
default |
{{ value|default:"null"}} |
如果value没有传值或者值为空的话就显示null |
length |
{{ value|length }} |
返回value的长度 |
filesizeformat |
{{ value|filesizeformat }} |
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等) |
slice |
{{value|slice:"2:-1"}} |
切片,如value="hello world",显示“llo worl” |
date |
{{value|date:"Y-m-d H:i:s"}} |
格式化,如果 value=datetime.datetime.now() |
safe |
{{ value|safe}} |
告诉Django这段代码是安全的不必转义(防止xss攻击,将html元素转义成文本) |
truncatechars |
{{ value|truncatechars:9} |
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。 |
truncatewords |
{{ value|truncatewords:3}} |
在一定数量的字后截断字符串,是截多少个单词。 |
cut |
{{ value|cut:值}} |
移除value中所有的与给出的变量相同的字符串 |
join |
{{ list|join:”值” }} |
使用字符串连接列表。就像Python的str.join(list) |
5.标签
格式:{% tag%}。告诉模板做些什么事。常用的有{%if %}{%endif%}、{%for%}{%endfor%}
(1){%if %}标签
{%if%}的布尔值为真的话,就显示{%if%}和{%endif%}之间的所有的内容。中间也可以有{%elif%}和{%else%}
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断,注意条件两边都有空格。
(2){%for%}
{%for%}允许按顺序遍历序列中的每个元素。每次循环模板系统都会渲染{%for%}和{%endfor%}之间的内容。
{%for%}之间内置一个forloop模板变量,该变量含有一些属性可以提供循环的信息。并且只能在for循环内部使用。
循环字典:
{% for key,val in dic.items %} <p>{{ key }}:{{ val }}</p> {% endfor %}
{{forloop}}几个重要的属性:
forloop.counter 当前循环的索引值(从1开始),forloop是循环器,通过点来使用功能
forloop.counter0 当前循环的索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
(3){%csrf_token%}
csrf是跨站请求伪造,csrf_token是用来跨站请求伪造保护。在form表单里面任意位置写上{%csrf_token%},通过浏览器正常访问网页提交数据就可以成功。原因是:在form表单里面任意位置写上{%csrf_token%},模板渲染的时候替换成了<input type="hidden" name="csrfmiddlewaretoken" value="8J4z1wiUEXt0gJSN59dLMnktrXFW0hv7m4d40Mtl37D7vJZfrxLir9L3jSTDjtG8">,在提交数据的时候,请求体中携带了这个随机字符串,后台就可以根据这个验证。
6.模板继承
Web开发有个重要的开发问题:如何减少一个常见页面区域的重复和冗余(如全站导航)。解决方式可以有在一个html里嵌套另一个页面。模板继承可以更好解决这个问题。模版继承可以让你创建一个基本的“骨架”模版,它包含您站点中的全部元素(包含网站的通用信息),并且可以定义能够被子模版覆盖的“块”。
(1)母模板
母模板定义了其他页面使用的基本html框架。使用{%block%}标签告诉模板引擎一个子模版可能在这覆盖内容。
比如:
{% block title %} {% endblock %} {% block sidebar %} {% endblock %} {% block content %} {% endblock %}
最好在写成{% endblock content%},更清晰。
(2)子模版
子模版来填充母模板中有block的地方。
方法:首先要写{% extends "base.html" %}。base.html是母模板的名称,extends告诉模板引擎这个页面继承了base.html。
其次,在相应的地方替换:
{% block title %} 替换内容 {% endblock %} {% block sidebar %} 替换内容 {% endblock %} {% block content %} 替换内容 {% endblock %}
注意:
如果你在模版中使用 {% extends %} 标签,它必须是模版中的第一个标签
在base模版中设置越多的 {% block %} 标签越好。请记住,子模版不必定义全部父模版中的blocks
{{ block.super }}可以得到母模版中的块内容。
7.组件
可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方,文件的任意位置按如下语法导入即可。
{% include 'navbar.html' %}