Django 模板渲染以及静态文件
基础语法
- 常用语法:{{ }}和 {% %};
- {{ }} 表示变量,在模板渲染的时候替换成值;
- {% %} 表示逻辑相关的操作
- 变量: {{ 变量名 }}
- 变量名由字母数字和下划线组成。
- 点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。
- 模板中支持的写法:
# 取l中的第一个参数 {{ l.0 }} # 取字典中key的值 {{ d.name }} # 取对象的name属性 {{ person_list.0.name }} # .操作只能调用不带参数的方法 {{ person_list.0.dream }}
- 注意:当模板系统遇到一个点(.)时,会按照如下的顺序去查询:
- 在字典中查询
- 属性或者方法(属性的优先级大于方法)
- 数字索引
- 条件控制与循环:
- for循环
- 用法
## 示例: <ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul> # for循环可用的一些参数: forloop.counter # 当前循环的索引值(从1开始) forloop.counter0 #当前循环的索引值(从0开始) forloop.revcounter # 当前循环的倒序索引值(从1开始) forloop.revcounter0 # 当前循环的倒序索引值(从0开始) forloop.first #当前循环是不是第一次循环(布尔值) forloop.last #当前循环是不是最后一次循环(布尔值) forloop.parentloop # 本层循环的外层循环
- for ... empty ...:当for循环执行完毕后, 没有找到顺序则执行empty里面代码;
- 示例用法:
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} <li>空空如也</li> {% endfor %} </ul>
- if-elif-else:条件控制;
- if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断;
- 不支持连续判断 如: if a>b>c 等
- 示例:
{% if user_list %} 用户人数:{{ user_list|length }} {% elif black_list %} 黑名单数:{{ black_list|length }} {% else %} 没有用户 {% endif %} # 单纯的 if ... else ... {% if user_list|length > 5 %} 七座豪华SUV {% else %} 黄包车 {% endif %
- with 定义中间变量;
- 示例:
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
- csrf_token : 跨站请求伪造保护;
- 在提交POST请求的form表单中加上{% csrf_token %}, 才可以正常访问;
- 属性的优先级大于方法:
- 示例:
def xx(request): d = {"a": 1, "b": 2, "c": 3, "items": "100"} return render(request, "xx.html", {"data": d}) # 如上,我们在使用render方法渲染一个页面的时候,传的字典d有一个key是items并且还有默认的 d.items() 方法,此时在模板语言中: {{ data.items }} # 默认会取d的items key的值。也就是 100
基础过滤器
- default:默认值;
- filesizeformat:格式化文件大小;
- add:给变量加参数;
- lower:小写;
- upper:大写
- title:标题;
- ijust:左对齐;
- center:居中;
- length:返回长度;
- slice:切片;
- first:取第一个元素;
- last:取最后一个元素;
- join:使用字符串拼接;
- truncatechars:截断
- data:格式化日期;
- safe:安全;
Django的模板中会对HTML标签和JS等语法标签进行自动转义, 这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义, 比如我们做一个内容管理系统,后台添加的文章中是经过修饰的, 这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本, 如果自动转义的话显示的就是保护HTML标签的源文件。 为了在Django中关闭HTML的自动转义有两种方式, 如果是一个单独的变量我们可以通过 过滤器“|safe”的方式 告诉Django这段代码是安全的不必转义。
- 示例:
# view.py def a(request): ... return render(request, "xxx.html", {"value": "<a href="#">点我</a>"}) # xxx.html {{ value|safe}}
母板继承
- 定义母板
- 定义母板中的内容
- 继承母板
- 更改母板中的内容
- 自定义固定组件
自定义filter,simpletag,inclusion_tag三种放法
- 自定义filter:
- filter函数可以返回布尔值;且可以做if 判断中的条件;
- 只可以接受的一个或两个参数;
- 自定义simple_tag:
- 可以接收多个参数;
- 自定义 inclusion_tag:
- 返回一段HTML代码;