Django之模板系统
四 标签Tags
标签看起来像是这样的:{% tag %}
。标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。一些标签需要开始和结束标签 (例如{% tag %} ...
标签 内容 ... {% endtag %})。
for标签
遍历每一个元素: 写个for,然后 tab键自动生成for循环的结构,循环很基础,就这么简单的用,没有什么break之类的,复杂一些的功能,你要通过js
{% for person in person_list %}{{ person.name }}
{% endfor %}
可以利用{%forobjinlistreversed%}反向完成循环。
遍历一个字典:
{% for key,val in dic.items %}{{ key }}:{{ val }}
{% endfor %}
注:循环序号可以通过{{forloop}}显示,必须在循环内部用

forloop.counter 当前循环的索引值(从1开始),forloop是循环器,通过点来使用功能forloop.counter0 当前循环的索引值(从0开始)forloop.revcounter 当前循环的倒序索引值(从1开始)forloop.revcounter0 当前循环的倒序索引值(从0开始)forloop.first 当前循环是不是第一次循环(布尔值)forloop.last 当前循环是不是最后一次循环(布尔值)forloop.parentloop 本层循环的外层循环的对象,再通过上面的几个属性来显示外层循环的计数等

for ... empty
for标签带有一个可选的{%empty%}从句,以便在给出的组是空的或者没有被找到时,可以有所操作。
{% for person in person_list %}{{ person.name }}
{% empty %}sorry,no person here
{% endfor %}
if 标签
{%if%}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。

{% if num > 100 or num < 0 %}无效
{% elif num > 80 and num < 100 %}优秀
{% else %}凑活吧
{% endif %}

当然也可以只有if和else
{% if user_list|length > 5 %} 七座豪华SUV{% else %} 黄包车{% endif %}
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断,注意条件两边都有空格。
with
使用一个简单地名字缓存一个复杂的变量,多用于给一个复杂的变量起别名,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
例如:
注意等号左右不要加空格。
{% with total=business.employees.count %} {{ total }} {% endwith %}
或
{% with business.employees.count as total %} {{ total }}{% endwith %}
csrf_token
我们以post方式提交表单的时候,会报错,还记得我们在settings里面的中间件配置里面把一个csrf的防御机制给注销了啊,本身不应该注销的,而是应该学会怎么使用它,并且不让自己的操作被forbiden,通过这个东西就能搞定。
这个标签用于跨站请求伪造保护,
在页面的form表单里面(注意是在form表单里面)任何位置写上{% csrf_token %},这个东西模板渲染的时候替换成了,隐藏的,这个标签的值是个随机字符串,提交的时候,这个东西也被提交了,首先这个东西是我们后端渲染的时候给页面加上的,那么当你通过我给你的form表单提交数据的时候,你带着这个内容我就认识你,不带着,我就禁止你,因为后台我们django也存着这个东西,和你这个值相同的一个值,可以做对应验证是不是我给你的token,存储这个值的东西我们后面再学,你先知道一下就行了,就像一个我们后台给这个用户的一个通行证,如果你用户没有按照我给你的这个正常的页面来post提交表单数据,或者说你没有先去请求我这个登陆页面,而是直接模拟请求来提交数据,那么我就能知道,你这个请求是非法的,反爬虫或者恶意攻击我的网站,以后将中间件的时候我们在细说这个东西,但是现在你要明白怎么回事,明白为什么django会加这一套防御。
爬虫发送post请求简单模拟:

import requestsres = requests.post('http://127.0.0.1:8000/login/',data={ 'username':'chao', 'password':'123'})print(res.text)

注释
{# ... #}
五 模板继承
Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的blocks 。
通过从下面这个例子开始,可以容易的理解模版继承:

{% block title %}My amazing site{%/span> endblock %} {% block content %}{% endblock %}

这个模版,我们把它叫作base.html
, 它定义了一个可以用于两列排版页面的简单HTML骨架。“子模版”的工作是用它们的内容填充空的blocks。
在这个例子中,block
标签定义了三个可以被子模版内容填充的block。block
告诉模版引擎: 子模版可能会覆盖掉模版中的这些位置。
子模版可能看起来是这样的:

{% extends "base.html" %} {% block title %}My amazing blog{% endblock %} {% block content %}{% for entry in blog_entries %}{{ entry.title }}
{{ entry.body }}
{% endfor %}{% endblock %}

extends
标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,首先,它将定位父模版在此例中,就是“base.html”。
那时,模版引擎将注意到base.html
中的三个block
标签,并用子模版中的内容来替换这些block。根据blog_entries
的值,输出可能看起来是这样的:

My amazing blog Entry one
This is my first entry.
Entry two
This is my second entry.

请注意,子模版并没有定义sidebar
block,所以系统使用了父模版中的值。父模版的{% block %}
标签中的内容总是被用作备选内容(fallback)。
这种方式使代码得到最大程度的复用,并且使得添加内容到共享的内容区域更加简单,例如,部分范围内的导航。
这里是使用继承的一些提示:
如果你在模版中使用
{% extends %}
标签,它必须是模版中的第一个标签。其他的任何情况下,模版继承都将无法工作,模板渲染的时候django都不知道你在干啥。在base模版中设置越多的
{% block %}
标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你可以在大多数blocks中填充合理的默认内容,然后,只定义你需要的那一个。多一点钩子总比少一点好。如果你发现你自己在大量的模版中复制内容,那可能意味着你应该把内容移动到父模版中的一个
{% block %}
中。If you need to get the content of the block from the parent template, the
{{ block.super }}
variable will do the trick. This is useful if you want to add to the contents of a parent block instead of completely overriding it. Data inserted using{{ block.super }}
will not be automatically escaped (see thenext section), since it was already escaped, if necessary, in the parent template. 将子页面的内容和继承的母版中block里面的内容同时保留
为了更好的可读性,你也可以给你的
{% endblock %}
标签一个名字。例如:
{% block content %}...{% endblock content %}
在大型模版中,这个方法帮你清楚的看到哪一个 {% block %}
标签被关闭了。
- 不能在一个模版中定义多个相同名字的
block
标签。
查看评论 回复
"Django之模板系统"的相关文章
- 上一篇:使用Scrapy爬取股票代码
- 下一篇:Django的下载安装以及实现一个简单示例