1、什么是模板?
模板就是用于响应的html文件,将页面的设计和Python的代码分离开会更干净简洁更容易维护。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题。
2、模板语法之变量
在视图函数中用render方法将变量以字典的方式传到模板,之后模板可以用{{'变量名'}}方式引用变量。
views:
def index(request): name = 'alex' age =22 students = ['alex', 'taibai', 'nvshen'] return render(request, 'index.html',{'name':name, 'age':age, 'students':students}
键值对的键名可以自己定
templates:
<body> <p>姓名{{ name }}</p> <p>年龄{{ age }}岁</p> <p>学生{{ students.0 }}</p> #用这种方式通过索引,提取列表中的某一个元素 <p>学生{{ students.1 }}</p> </body>
如果需要传大量的变量,往render中挨个写就不太方便了,所以要用locals()方法,
def index(request): name = 'alex' age =22 students = ['alex', 'taibai', 'nvshen'] into = {'name':'alex', 'age': 100, 'gender': 'other'} return render(request, 'index.html', locals())
这样就可以将所有变量都传进去了。
3、模版之过滤器
具体格式为{{变量|过滤器:参数}}
default:如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
<p>{{ book_list1|default:'没有符合条件的书籍' }}</p>
length:返回值的长度。它对字符串和列表都起作用。例如:
{{ list|length }}
filesizeformat:将值格式化为一个 “人类可读的” 文件尺寸 (例如
'13 KB'
, '4.1 MB'
, '102 bytes'
, 等等)。例如:
{{ fail_size|filesizeformat }}
date:将时间转换为需要的格式。例如:
views:
value=datetime.datetime.now()
templates:
{{ value|date:"Y-m-d" }}
也可以是:
{{ value|date:"Y/m/d" }}
slice:字符串切片。例如:
{{ value|slice:"2:-1" }}
truncatechars:如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。例如:
views:
shi = 'When you are old and grey and full of sleep, And nodding by the fire,take down this book, And slowly read,and dream of the soft look '
templates:
<p>{{ shi|truncatechars:5 }}</p>
结果为:whe...
注意:...也要占用三个字节的位置。
safe:Django为了安全,会自动将各种标签转译,但是有时侯我们不惜要他转译,就需要safe了。例如:
views:(直接导入这个变量,会在界面上生成一个字符串,必须加上safe过滤器,才能生成一个a标签)
link = "<a href= 'http://www.baidu.com'>点我</a>"
templates:
<p>{{ link|safe }}</p>
4、模板的标签
for标签:遍历每一个元素。例如:
{% for person in person_list %} <p>{{ person.name }}</p> {% endfor %}
字典也可以。
{% for key,val in dic.items %} <p>{{ key }}:{{ val }}</p> {% endfor %}
for标签页游它自己的方法。
forloop.counter:生成这个元素是第几次循环得到的。
{% for book in book_list %} <li>{{ forloop.counter }} {{ book }} </li> {% endfor %}
forloop.counter0:同上,只是变成从0开始。
forloop.revcounter:反过来
forloop.revcounter0:反过来从零开始
forloop.first:判断这个元素是不是第一次循环得到的,是的话显示True。
forloop.last:判断这个元素是不是最后一次循环得到的,是的话显示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 or num < 0 %} <p>无效</p> {% elif num > 80 and num < 100 %} <p>优秀</p> {% else %} <p>凑活吧</p> {% endif %}
for标签中可以套if标签:
{% for person in person_list %} {% if person.age > 900 %} <p>{{ person.name }} {{ person.age }}</p> {% endif %} {% endfor %}
with标签:使用一个简单地名字缓存一个复杂的变量,当你需要使用一个方法(比如访问数据库)很多次的时候是非常有用的。
{% with name=person_list.2.name %} <p>{{ name }}</p> {% endwith %}
这样就把person_list.2.name换存在name下了,不用每次都这么复杂的去找。
csrf_token标签:这个标签用于跨站请求伪造保护,即生成一个token,用于用户的认证。
5、模板的继承
假如我们有多个页面的大致框架都是一样的,只是其中的个别标签不同,我们如果每个页面都将全部的模板编写出来,会有大量的重复代码,所以这个时候,为了代码的简洁,我们可以将这些重复的代码放到一个文件中,供其他模板继承使用,这个文件就称之为母版。
在母版中,有特定的地方供其他子模板添加标签,被称之为盒子(钩子)--Blocks.
模板base.html
<div class="col-md-9"> {% block contend %} <h3>welcom</h3> #子模板中如果没有内容,则返回这里的内容,子模板中如果有内容,则覆盖这里的内容。 {% endblock %} </div>
子模板index.html
{% extends 'base.html' %} <div class="jumbotron"> <h1>Hello, world!</h1> <p>...</p> <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p> </div> {% endblock %}
这里用{% extends %}
标签来告诉系统,他的母版是base.html,系统在访问index.html页面时,回先定向于base.html,注意:{% extends %}
标签必须在子模板的第一行。
在母版中可以设置多个盒子,并且越多越好。
如果你需要同时显示盒子里和子模板中的内容,可以用{{ block.super }}标签,
{% extends 'base.html' %} {% block contend %} {{ block.super }} <div class="jumbotron"> <h1>Hello, world!</h1> <p>...</p> <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p> </div> {% endblock %}
为了更好的可读性,你也可以给你的 {% endblock %}
标签一个 名字 。例如:
{% block content %}
...
{% endblock content %}
不能在一个模版中定义多个相同名字的 block
标签。