一、变量(Variables)
用于展示视图传递的动态数据,语法:{{ 变量名 }}
核心特点:
- 查找顺序:先查字典键(
dict.key)→ 再查对象属性(obj.attr)→ 最后查列表索引(list.0) - 特殊变量:模板中可直接使用部分内置上下文变量(需配置
context_processors),如: {{ request }}:当前请求对象(含method/path等属性){{ user }}:当前登录用户对象(含username/is_authenticated等属性){{ messages }}:消息框架的提示信息
示例:
<!-- 展示视图传递的user对象的username属性 -->
<p>用户名:{{ user.username }}</p>
<!-- 展示列表的第一个元素 -->
<p>第一个元素:{{ my_list.0 }}</p>
<!-- 展示字典的value -->
<p>年龄:{{ my_dict.age }}</p>
二、标签(Tags)
用于实现逻辑控制(循环、判断等)或模板复用,语法:{% 标签名 参数 %}(需闭合,如{% endif %})
1. 流程控制标签
- if 条件判断支持比较运算符(
==/!=/</>/<=/>=)、逻辑运算符(and/or/not)、in(包含)、is(身份判断)。
```html {% if score >= 90 %}
优秀
{% elif score >= 60 %}及格
{% else %}不及格
{% if "apple" in fruits %}
包含苹果
{% endif %} ```- for 循环遍历用于遍历列表、字典、QuerySet 等可迭代对象,配合
forloop变量获取循环信息。
html
{% for book in books %}
<p>{{ forloop.counter }}. {{ book.title }}</p> <!-- counter:从1开始的序号 -->
{% empty %} <!-- 迭代对象为空时执行 -->
<p>暂无书籍</p>
{% endfor %}
forloop常用属性:
counter:当前循环次数(从 1 开始)counter0:当前循环次数(从 0 开始)first:是否为第一次循环(True/False)last:是否为最后一次循环(True/False)parentloop:嵌套循环中,获取父循环的forloop对象
2. 模板复用标签
- 模板继承(extends + block)实现模板复用,父模板定义可替换的 “块”,子模板重写块内容。
父模板(base.html):
```html
```
子模板:
```html {% extends "base.html" %}
{% block title %}首页{% endblock %}
{% block content %}
欢迎访问首页
{{ block.super }} {% endblock %} ```- 包含(include)将其他模板片段嵌入当前模板,可传参数。
```html
{% include "header.html" with title="首页" is_login=True %} ```
3. 常用工具标签
{% csrf_token %}:在 POST 表单中添加 CSRF 令牌,防止跨站请求伪造(必须加!)
```html
```
{% url '路由别名' 参数 %}:根据 urls.py 中定义的name生成 URL,避免硬编码
```html
查看第10本书 ```
{% static '静态文件路径' %}:生成静态文件(CSS/JS/ 图片)的 URL,需先加载 static 标签库
html
{% load static %} <!-- 加载静态文件标签库 -->
<link rel="stylesheet" href="{% static 'css/style.css' %}">
<img src="{% static 'images/logo.png' %}">
{% load 标签库名 %}:加载自定义标签库或第三方标签库(如static属于django.contrib.staticfiles的标签库)
4. 注释标签
- 单行注释:
{# 注释内容 #}(不会被渲染到 HTML) - 多行注释:
{% comment %} 多行注释内容 {% endcomment %}
三、过滤器(Filters)
用于对变量进行处理(格式化、转换等),语法:{{ 变量|过滤器:参数 }}(可链式调用:{{ var|filter1|filter2 }})
常用过滤器:
| 过滤器 | 作用 | 示例 | |
|---|---|---|---|
lower |
转小写 | {{ "HELLO" | lower }}→hello |
|
upper |
转大写 | {{ "hello" | upper }}→HELLO |
|
truncatechars:n |
截断为 n 个字符(含省略号...) |
{{ "abcdefg" | truncatechars:5 }}→ab... |
|
truncatewords:n |
截断为 n 个单词(按空格分割) | {{ "I like Django" | truncatewords:2 }}→I like ... |
|
date:"格式" |
日期格式化(参考 Python strftime) | {{ now | date:"Y-m-d H:i:s" }}→2023-10-01 12:30:00 |
|
default:默认值 |
变量为空 / None 时显示默认值 | {{ age | default:"未知" }} |
|
length |
返回变量长度(字符串 / 列表等) | {{ ["a", "b"] | length }}→2 |
|
join:分隔符 |
用分隔符拼接列表元素 | {{ ["a", "b"] | join:", " }}→a, b |
|
safe |
标记为安全内容(不转义 HTML) | {{ html_str | safe }}(谨慎使用,防 XSS) |
四、注意事项
- 模板语法不支持直接写 Python 代码(如
for i in range(10)),逻辑需在视图中处理。 - 变量不存在时,模板默认不显示(可通过
default过滤器处理)。 safe过滤器需谨慎使用:若内容含用户输入,可能导致 XSS 攻击。- 模板上下文由视图通过
render(request, 'tpl.html', context)传递(context是字典)。
发表评论