Django Template模板层(上)--------模板层相关及其他常用标签
- 模板层
Django中的HTML文件并不是一个简单的前端页面,他支持多种渲染方式;
比如 Smart 或是 Jinja 这样出名的模板语言引擎,默认django使用的是templates引擎来进行模板页面的渲染,这也被称为Django模板语言(DTL)
-
-
- 模板语言主要有模板变量和模板标签
-
<div> {{ account }} </div>
-
-
- 模板变量通过视图函数传递字典变量,字典的 key 值为对应模板变量名,对应 value 是模板变量实际被渲染的值
-
def index(request): content = {'account':'test'} return render(request,html,content)
-
-
- 最终渲染结果
-
<div> test </div>
模板引擎遇到这个变量,将会计算他,并且将结果覆盖;如果视图函数中,并没有给这个模板变量赋值,也没有关系,模板会自动将这个 {{ account }} 处理为一个空
注意:模板变量名,只能以字母数字下划线构成,下划线不可以打头,并且也不可以使用表单符号组成模板。
-
- 变量获取方式
当我们返回的是一个字符串数据,这应该是最简单的处理方式,前端模板会直接将它展示到页面中。
如果返回的是一个列表序列数据或者字典键值对数据,我们可以使用模板语言中的 . 符号来进行其中值的获取,当模板变量中有符号 . 的存在时,比如 content.key 他会按照如下顺序来进行查找。
1.字典查找: content[key]
2.对应属性和方法查找: content.key
¤ 注意:因为对应key值的查找优先级要低于属性方法,所以要尽量避免使用数据内置方法作为key值。
3.序列索引方式查找: content[index]
-
- Python数据在模板
Python常用数据有int,float,str,list,tuple,dict,set等,把他们都通过模板变量传递到模板页面试试。
def index(request): int_ = 123 float_ = 0.123 str_ = 'str' list_ = ['l','i','s','t'] tuple_ = ('t','u','p','l','e') dict_ = {"key":"value"} set_ = {'s','e','t'} return render(request,"index.html",locals())
locals() :该函数将当前作用域下的所有变量名和对应变量值组成字典,免去了我们构造存储字典的麻烦。
<p>{{ int_ }}</p> <p>{{ float_ }}</p> <p>{{ str_ }}</p> <p>{{ list_ }}</p> <p>{{ tuple_ }}</p> <p>{{ dict_ }}</p> <p>{{ dict_.key }}</p> <p>{{ set_ }}</p>
到了模板页面上,这些变量值其实也都像变成了字符串一样,直接展示
123 0.123 str ['l', 'i', 's', 't'] ('t', 'u', 'p', 'l', 'e') {'key': 'value'} {'e', 's', 't'}
-
- for标签
使用模板中使用标签语言 {% for %} 和 {% endfor%} ,对视图函数传递的数据集进行遍历访问,比如上面传递的字符串,列表,元祖,字典,集合这样的数据
和普通模板变量不同,模板标签使用大括号百分号的组合 {% lag %} ,具有有一些特殊的功能性
模板中的标签 {% for %} 与Python中的for循环类似,要记得有闭合模板标签 {{ endfor }}
{% for var in sequence %} {{ var }} {% endfor %}
来把上面的数据进行访问
{% for var in str_ %} <p>{{ var }}</p> {% endfor %} --------------------- {% for var in list_ %} <p>{{ var }}</p> {% endfor %} --------------------- {% for var in tuple_ %} <p>{{ var }}</p> {% endfor %} --------------------- {% for var in set_ %} <p>{{ var }}</p> {% endfor %}
看到的效果和在Python中迭代访问的结果是差不多的,并且模板循环还会使对应的标签也进行循环
接下来来看字典,通过模板循环从字典中取出来的是字典的key值
{% for var in dict_ %} <p>{{ var }} {{ dict_.var}}</p> {% endfor %}
在for循环遍历访问字典的时候,不能再像Python语法里一样,直接通过迭代获取 key 之后通过dict[key] 或是 dict.key ,拿到对应value;
模板变量不会把 var 解释成取到的对应 key 值,var只是作为了一个单纯的 var 字符串,除非在字典中,有var 字符串做为字典的键值,否则是取不到的
正确的对字典中键值对进行获取的方式是通过内置字典 items 属性:
{% for key,value in dict_.items %} <p>{{ key }} {{ value}}</p> {% endfor %}
注意:模板语言中,不会出现索引超出范围的 IndexError 或者Key值不存在的 KeyError ,取不出任何东西则只是一个空.
在 {% for %} 循环中,我们还可以使用很多有用的模板变量,方便我们控制循环:
{% for var in iterable %} {{ forloop.counter }} <!--当前循环次数,从1开始计数 --> {{ forloop.counter0 }} <!--当前循环次数,从0开始计数 --> {{ forloop.revcounter }} <!--当前循环次数,从最大长度开始 --> {{ forloop.revcounter0 }} <!--当前循环次数,从最大索引开始 --> {{ forloop.first }} <!-- 判断是否为第一次循环 --> {{ forloop.last }} <!-- 判断是否为第一次循环 --> {{ forloop.parentloop }} <!-- 当循环嵌套时,访问上层循环 --> {% endfor %}
通过 {% empty %} 标签判断迭代对象是否为空:
{% for var in test_list %} {{ var }} {% empty %} 空空如也 {% endfor %}
-
- if标签
可以通过 {% if %} 标签语法来进行模板变量的值判断;
语法如下:
{% if test_list %} 列表不为空 {% elif test_dict %} 列表为空,字典不为空 {% else %} 列表字典均为空 {% endif %}
并且 if 标签还支持 and 、 or 及 not 来进行变量的布尔判断:
{% if test_list and test_dict %} 列表、字典均不为空 {% endif %}
{% if not test_list %} 列表为空时才能满足IF条件判断 {% endif %}
{% if test_list or test_dict %} 列表、字典某一个不为空 {% endif %}
{% if not test_list or test_dict %} 列表为空或字典不为空 {% endif %}
{% if test_list and not test_dict %} 列表不为空并且字典为空 {% endif %}
也支持同时使用and及or语句,但是and的条件判断优先级要高于or语句:
{% if a or b and c %} 等同于 {% if a or (b and c) %}
if 标签还支持 == 、 != 、 > 、 < 、 >= 、 <= 的判断用法:
{% if var == "1" %} 这个值是"1" {% endif %}
{% if var != "x" %} 判断不相等成立 {% endif %}
{% if var < 100 %} var大于100 {% endif %}
{% if var >= 100 %} var大于100 {% endif %}
如果判断的数据类型在后台传递到模板变量时具体数值类型为整型或浮点型而不是字符串,不需要在判断的时候加字符串的标识引号。在模板语言中,不支持连续判断:
{% if 100 > var > 50 %} var大于50小于100 {% endif %}
应该使用and语句写成这样:
{% if 100 > var and var > 50 %} var大于50小于100 {% endif %}
除去运算符之外, if 标签还支持 in 和 not in 的判断运算:
{% if 1 in test_list %} 列表中有数字1 {% endif %}
- 其他常用标签
其实 django 官方提供了不只 if 和 for 这样的模板标签,还提供了很多可以让我们在模板页面上实现之前只能在后台进行逻辑实现的功能标签,比如以下: