您当前的位置: 首页 >  django

CSDN 程序人生

暂无认证

  • 1浏览

    0关注

    1993博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

小白必看!Django 模板语言进阶!

CSDN 程序人生 发布时间:2019-09-21 11:07:00 ,浏览量:1

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 单雨

责编 | 胡巍巍

出品 | 程序人生(ID:coder_life)

 

640?wx_fmt=png

模板继承

 

1.1 简介 

模板继承允许你建立一个基本的"骨架"模板, 它包含了网站中所有常见的元素,并定义了可以被子模板覆盖的 块(blocks) 。示例: 

假如父模板base.html如下:

 

django          {% block title %}My amazing site{% endblock %}              {% block sidebar %}         

                
  • Home
  •             
  • Blog
  •         
        {% endblock %}     
             {% block content %}{% endblock %}     

它定义了一个简单的 HTML 骨架文档, 假设这是一个简单的两列页面。子模板的工作就是填充空的 块(block) 中的内容。

在这个例子中, block 标签定义了三个可以被子模板填充的块。block 标签告诉了模板系统哪些地方可能被子模板覆盖。例如,子模板可能如下: 

 

django {% 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 标签, 并且使用子模板的内容替换掉这些块。根据变量 blog_entries 的值, 输出可能看起来像这样:

 

django          My amazing blog              

                
  • Home
  •             
  • Blog
  •         
    
             Entry one         

This is my first entry.

        Entry two         

This is my second entry.

    

注意:因为子模板没有定义 sidebar 块, 那么父模板的内容就会被使用。通常来说, 父模板 {% block %} 中的内容会被作为备用的内容,在子模板没有覆盖时就会被使用。 

1.2 多重继承 

模板继承可以是多重继承,多重继承常见的模式是: 

上述的关系可以用下图表示: 

640?wx_fmt=png

这样就能最大限度的重用模板代码,比如在所有页面通用的导航栏。 

1.3 模板继承注意事项 

{% extends %}必须位于模板的最开始, 如果在其他的部分声明, 则不生效。 

在基础模板尽可能多的使用{%block%} ,子模板不需要定义所有父模板中的块,所以你可以在若干的块中填充默认值, 然后定义之后需要自定义的块, 有更多的可用块总是更好的。 

如果发现自己在许多模板中有重复内容的了, 这可能需要移动这些内容到父模板的 `{% block %}` 中。 

如果需要得到父模板块中的内容, 可以用 `{{ block.super }}` 变量。使用 `{{ block.super }}` 插入的数据不会被自动转义 ,因为它已经被转义了。如果需要转义, 可以在父模板中转义。 

使用模板标签在{% block %}块外部创建的变量不能在块内使用。例如,这个模板不渲染任何东西:

 

django   {% trans "Title" as title %}   {% block content %}{{ title }}{% endblock %}

为了具有更好的可读性,也可以给{% endblock %}块标签定义一个名字。例如:

 

django   {% block content %}   ...   {% endblock content %}

在一个较长的模板中, 这个方法可以让你知道是哪一个 `{% block %}` 标签定义结束了。 

不能在同一模板中定义多个具有相同名称的块标签。存在这个限制是因为{%block%}标签是"双向"定义的。

也就是说, 它不仅指定了子模板要填充父模板的哪个块, 也说明了父模板要引用哪些子模板块的内容。

所以在子模板中有多个同名的{%block%}标签时, 父模板就不知道到底要引用子模板中哪个块的内容了。

 

640?wx_fmt=png

自动HTML转义

 

2.1 从模板直接生成HTML存在XSS风险 

从模板生成HTML时, 总是有一种风险, 即一个变量将会影响生成的HTML字符。考虑这个模板片段: 

 

django Hello, {{ name }}

看起来可能没有什么风险,但是如果用户输入的名字为一个HTML代码: 

 

django alert('hello')

当{{name}}为这个值时,模板将呈现为: 

 

django Hello, alert('hello')

这将使浏览器弹出一个弹出一个JavaScript警告。同样的,考虑另外一种情况: 

如果名字中包含一个 `'

关注
打赏
1614322772
查看更多评论

最近更新

热门博客

立即登录/注册

微信扫码登录

0.1346s