您现在的位置: 主页 > 上位机技术 > python > Django之模板系统
本文所属标签:
为本文创立个标签吧:

Django之模板系统

来源:net 网络用户发布,如有版权联系网管删除 2019-02-25 

四 标签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.

复制代码

  请注意,子模版并没有定义sidebarblock,所以系统使用了父模版中的值。父模版的{% 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标签。



              查看评论 回复



嵌入式交流网主页 > 上位机技术 > python > Django之模板系统
 标签 循环 当前

"Django之模板系统"的相关文章

网站地图

围观()