Django--模板
Posted 490144243msq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django--模板相关的知识,希望对你有一定的参考价值。
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
标签。
以上是关于Django--模板的主要内容,如果未能解决你的问题,请参考以下文章