在django中自带的是DTL( Django template language)模板。
模板的配置settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTempla
tes',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
},},]
- 若想在 Python 代码中使用 Django 的模板系统,基本方式如下:
1.以字符串形式提供原始的模板代码,创建 Template 对象。
2.在 Template 对象上调用 render() 方法,传入一系列变量(上下文)。返回的是完全渲染模板后得到的字符串,模板中的变量和模板标签已经根据上下文求出值了。
创建Template对象
- 最简单的方式是直接实例化。 Template 类在 django.template 模块中,构造方法接受一个参数,即原始的模板代码。
渲染模板
-
有了 Template 对象之后,可以为其提供上下文,把数据传给它。上下文就是一系列模板变量和相应的值。模板使用上下文填充变量,求值标签。在 Django 中,上下文使用 django.template 模块中的 Context 类表示。它的构造方法接受一个可选参数:一个字典,把变量名映射到值上。
-
Django 模板系统的基本用法:编写模板字符串,创建 Template 对象,创建 Context 对象,然后调用 render() 方法。
上下文变量查找
-
遍历 Django 模板中复杂数据结构的关键是点号( . )。点号可以访问字典的键、属性、方法或对象的索引。假如我们把一个 Python 字典传给模板。若想通过键访问那个字典中的值,要使用点号。
-
注意,方法调用中没有括号。此外,不能给方法传递变量,只能调用无需参数的方法。不允许使用负数索引。
-
模板系统遇到变量名中的点号时会按照下述顺序尝试查找:
-
字典查找(如 foo["bar"] )
-
属性查找(如 foo.bar )
-
方法调用(如 foo.bar() )
-
列表索引查找(如 foo[2] )
-
模板系统将使用第一个可用的类型,这是一种短路逻辑。点号查找可以嵌套多层。
一般来说,如果变量不存在,模板系统在变量处插入引擎的 string_if_invalid 配置选项。这个选项的默认值为一个空字符串。
模板语言
标签(大约24个)
1.if/else:{% if %} 支持使用 and 、 or 或 not 测试多个变量,或者取反指定的变量。
- 如果需要通过括号指明优先级,应该使用嵌套的 if 标签。不支持使用括号控制操作的顺序。如果觉得有必要使用括号,可以考虑在模板外部执行逻辑,然后通过专用的模板变量传入结果。或者,直接使用嵌套的 {%if %} 标签。
2.for:
1.在标签中添加 reversed ,反向迭代列表。
2.可以嵌套
3.如果需要迭代由列表构成的列表,可以把每个子列表中的值拆包到独立的变量中。
4.如果需要访问字典中的元素,也可以使用这个标签。
5.在循环结束之前,无法“跳出”。如果需要这么做,修改要迭代的变量,只包含需要迭代的值。
6.同样,也没有“continue”语句,不能立即返回到循环的开头。
7.在 {% for %} 循环内部,可以访问一个名为 forloop 的模板变量。这个变量有几个属性,通过它们可以获知循环进程的一些信息:(待补充)
3.ifequal/ifnotequal:
用于比较两个值,在相等时显示一些内容。
1.{% ifequal %}
标签比较两个值,如果相等,显示 {% ifequal %}
和{% endifequal %}
之间的内容。
2.参数可以是硬编码的字符串,使用单引号或双引号都行
3.支持可选的 {% else %}
子句
4.{% ifequal %}
的参数只能是模板变量、字符串、整数和小数
5.其他变量类型,例如 Python 字典、列表或布尔值,不能在 {% ifequal %}
中硬编码。
6.ifequal 标签可以替换成 if 标签和 == 运算符。
7.{% ifnotequal %}
的作用与 ifequal 类似,不过它测试两个参数是否不相等。 ifnotequal 标签可以替换成 if标签和 != 运算符。
4.include模板标签:{%include%}
1.作用:引入另一个模板的内容。它的参数是要引入的模板的名称,可以是变量,也可以是硬编码的字符串(放在引号里,单双引号都行)。
注释:
1.使用{# #}
不能分成多行
2.使用{%comment%}
编写多行标签,注释不能嵌套。
过滤器:
1.模板过滤器是在显示变量之前调整变量值的简单方式。
2.有些过滤器可以接受参数。过滤器的参数放在冒号之后,始终放在双引号内。
常见过滤器(大约60个)
1.default:如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。
2.length:返回值的长度。它对字符串和列表都起作用。
3.filesizeformat:将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB' , '4.1 MB' ,'102 bytes' , 等等)
4.addslashes :在反斜线、单引号和双引号前面添加一个反斜线。可用于转义字符串。
5.date :根据参数中的格式字符串格式化 date 或 datetime 对象。
render函数:
render(request, template_name, context=None, content_type=None, status=None, using=None)
- render() 的第一个参数是请求对象,第二个参数是模板名称,第三个单数可选,是一个字段,用于创建传给模板的上下文。如果不指定第三个参数, render() 使用一个空字典。
模板继承
1.子模板可以覆盖块的内容、向块中添加内容,或者原封不动。
2.{% block %}
它的作用很简单,告诉模板引擎,子模板可以覆盖这部分
内容。
3.{% extends "base.html" %}
继承
4.继承经常使用下述三层结构:
1.创建 base.html 模板,定义网站的整体外观。这个模板的内容很少变化。
2.为网站中的各个“区域”创建 base_SECTION.html 模板(如 base_photos.html 和 base_forum.html )。这
些模板扩展 base.html ,包含各区域专属的样式和设计。
3.为各种页面创建单独的模板,例如论坛页面或相册。这些模板扩展相应的区域模板。
5.如果需要从父模板中的块里获取内容,使用 {{ block.super }}
,这是一个“魔法”变量,提供父模板中渲染后的文本。向块中添加内容,而不是完全覆盖时就可以这么做。
高级模板技术
RequestContext 和上下文处理器(待补充)
跨站脚本攻击(Cross Site Scripting,XSS)
- 为了避免这种漏洞,有两个选择:
1.每个不信任的变量都传给 escape 过滤器,把有潜在危害的 HTML 字符转换成无危害的。Django 起初的几年默认采用这种方案,它的问题是把责任强加到开发者或模板编写者身上了,你要确保转义一切。但是,忘记转义数据是常事。
2.利用 Django 的自动转义 HTML 特性。
Django 默认转义模板中的每个变量标签。具体而言,转义的是下面五个字符:
-
< 转换成
<
; -
转换成
>
;
3.(单引号)转换成 '
;
4." (双引号)转换成 "
;
5.& 转换成 &
;
这个行为默认已启用。如果使用 Django 的模板系统,就能受到这一措施的保护。
禁用html转义
1.在单个变量中禁用:safe过滤器
2.在模板中的块里禁用:
{% autoescape off %}
Hello {{ name }}
{% endautoescape %}
-
autoescape 标签的参数为on 或off。有时需要强制自动转义,有时则想禁用。
-
如果使用模板的环境不确定是否启用了自动转义,应该添加 escape 过滤器,用于转义需要转义的变量。如果启用了自动转义, escape 过滤器会再次转义数据,但是这样做并无坏处,因为 escape 过滤器对自动转义过的
变量没有影响。
3.自动转义过滤器参数中的字符串字面量:
-
字符串字面量插入模板时不会自动转义,就像是经过 safe 过滤器处理过了一样。
-
从变量中得出的数据不是如此。变量的内容在需要时会自动转义,因为它们不在模板编写人的控制范围内