Django模板语言是Django内置的模板语言,Jinjia2是当前Python最流行的模板语言。 5-1 变量与标签 # 变量以{{ variable }}表示,variable是变量名,变量的类型可以是Python支持的数据类型,使用方法如下: # 从下面的例子可以看出,模板的变量需要和标签相互结合使用 # 模板的标签就如Python里面的函数和方法 <ul id="cate_box" class="lf"> {% for type in type_list %} #是for遍历标签,将变量进行遍历输出 <li> <h3><a href="#">{{ type.type }}</a></h3> #代表变量type_list的某个属性 <p> {% for name in name_list %} {% if name.type == type.type %} #是if判断标签,主要对变量进行判断处理 <span>{{ name.name }}</span> {% endif %} {% endfor %} </p> </li> {% endfor %} </ul> # Django常用内置标签 # {% for %} 遍历输出变量的内容,变量类型应为列表或数据对象 {% for item in myList %} {{ item }} {% endfor %} # {% if %} 对变量进行条件判断 # {% csrf_token %} 生成csrf_token的标签,用于防护跨站请求伪造攻击 # {% url %} 引用路由配置的地址,生成相应的URL地址 # {% with %} 将变量名重新命名 {% with total=products_total %} {{ total }} {% endwith %} # {% load %} 加载导入Django的标签库 # {% static %} 读取静态资源的文件内容 # {% extends xxx %} 模板继承,xxx为模板文件名,使当前模板继承xxx模板 # {% block xxx %} 重写父类模板的代码 # for标签模板变量说明 # forloop.counter 获取当前循环的索引,从1开始计算 # forloop.counter() 获取当前循环的索引,从0开始计算 # forloop.recounter 索引从最大数开始递减,直到索引到1的位置 # forloop.recounter() 索引从最大数开始递减,直到索引到0的位置 # forloop.first 当遍历的元素为第一项时为真 # forloop.last 当遍历的元素为最后一项时为真 # forloop.parentloop 在嵌套的for 循环中,获取上层for循环的forloop # 通过简单的例子来进一步了解forloop的使用: {% for name in name_list %} {% if forloop.counter == 1%} <span>这是第一次循环</span> {%elif forloop.last %} <span>这是最后一次循环</span> {% else %} <span>本次循环次数为:{{forloop.conter}}</span> {% endif %} {% endfor %} 5-2 模板继承 # 步骤1:在模板index.html中使用{% extends "base.html" %}来继承模板base.html的代码 # 步骤2:由标签{% block body %}在继承模板的基础上实现自定义模板的内容 # 步骤3:由{% endblock %}结束block标签 5-3 自定义过滤器 # 过滤器主要是对变量的内容进行处理,如替换、反序和转义等 # variable代替模板变量,管道符号“|”代表变量使用过滤器,filter代表某个过滤器,变量可以支持多个过滤器同时使用: {{ variable | filter | lower }} # 在使用的过程中,有些过滤器还可以传入参数,但仅支持一个参数的传入: {{ variable | date:"D d M Y" }} # 表5-3 Django的内置过滤器 # add {{ value|Add:"2" }}将value的值增加2 # date {{ value|date:"D d M Y" }}将日期格式数据按照给定的格式输出 # first {{ value|first }}返回列表中的第一个Item # last {{ value|last }}返回列表中的最后一个Item # length {{ value|length }}返回value的长度 # 在实际开发中,如果内置过滤器的功能不太适合实际开发需求,我们可以通过总定义过滤器来解决问题。 from django import template # 注册过滤器 register = template.Library() # 声明并定义过滤器 @register.filter def myreplace(value, agrs): oldValue = agrs.split(':')[0] newValue = agrs.split(':')[1] return value.replace(oldValue, newValue) # 最后在HTML模板中使用我们自定义的过滤器,以index.html模板的title为例: # 用于导入templatetags文件夹的myfilter.py文件中所定义的功能,用来告诉django在哪个地方可以找到自定义过滤器 {% load myfilter %} <head> 把变量title含有"首页"的内容替换成"我的首页" <title>{{ title|myreplace:'首页:我的首页' }}</title> <meta charset="utf-8"> {% load staticfiles %} </head>