Django变量和过滤器
外观
Django变量和过滤器[编辑 | 编辑源代码]
Django模板系统中的变量和过滤器是动态渲染HTML内容的核心机制。变量用于在模板中显示动态数据,而过滤器则用于在显示前对变量值进行格式化或处理。本教程将详细介绍它们的语法、用法及实际应用场景。
变量[编辑 | 编辑源代码]
变量是Django模板中引用上下文中传递的数据的基本方式,语法为双花括号:模板:Variable name
。当模板引擎渲染时,它会用上下文中的实际值替换这些变量。
基本用法[编辑 | 编辑源代码]
假设在视图(view)中传递了如下上下文:
def my_view(request):
context = {
'username': 'Alice',
'age': 25,
'books': ['Python入门', 'Django实战', 'Web开发进阶']
}
return render(request, 'my_template.html', context)
在模板文件(my_template.html)中,可以通过变量名直接访问:
<p>用户名: {{ username }}</p>
<p>年龄: {{ age }}</p>
<p>第一本书: {{ books.0 }}</p> <!-- 访问列表索引 -->
输出结果:
<p>用户名: Alice</p>
<p>年龄: 25</p>
<p>第一本书: Python入门</p>
变量解析规则[编辑 | 编辑源代码]
Django模板引擎按以下顺序解析变量:
- 字典键查找(如
模板:User.name
对应user['name']
) - 属性查找(如
模板:User.name
对应user.name
) - 列表/元组索引查找(如
模板:Items.0
)
如果变量不存在,模板系统会静默失败(不报错,输出空字符串)。
过滤器[编辑 | 编辑源代码]
过滤器通过管道符(|
)对变量进行转换,语法为 模板:Variable
。Django内置了60+个过滤器,涵盖字符串处理、日期格式化、数学运算等场景。
常用过滤器示例[编辑 | 编辑源代码]
字符串处理[编辑 | 编辑源代码]
{{ "hello world"|title }} <!-- 输出 "Hello World" -->
{{ "Django"|lower }} <!-- 输出 "django" -->
{{ "Python is great"|truncatechars:10 }} <!-- 输出 "Python i..." -->
数值处理[编辑 | 编辑源代码]
{{ 12345|filesizeformat }} <!-- 输出 "12.1 KB" -->
{{ 3.1415926|floatformat:2 }} <!-- 输出 "3.14" -->
日期格式化[编辑 | 编辑源代码]
假设上下文中有 date = datetime.datetime.now()
:
{{ date|date:"Y-m-d H:i" }} <!-- 输出类似 "2023-08-15 14:30" -->
{{ date|timeuntil }} <!-- 输出 "2 hours, 30 minutes" -->
自定义过滤器[编辑 | 编辑源代码]
如需创建自定义过滤器:
1. 在应用目录下创建 templatetags/
文件夹
2. 新建 __init__.py
和自定义模块(如 my_filters.py
)
3. 编写过滤器函数并注册:
from django import template
register = template.Library()
@register.filter
def multiply(value, arg):
return float(value) * float(arg)
使用方式:
{% load my_filters %}
{{ 5|multiply:3 }} <!-- 输出 15 -->
实际应用案例[编辑 | 编辑源代码]
案例1:用户资料页面[编辑 | 编辑源代码]
假设需要显示用户信息,并对敏感数据脱敏:
<p>用户名: {{ user.username|capfirst }}</p>
<p>邮箱: {{ user.email|slice:":3" }}***@{{ user.email|split:"@"|last }}</p>
<p>注册时间: {{ user.join_date|date:"F j, Y" }}</p>
案例2:电商价格展示[编辑 | 编辑源代码]
{% for product in products %}
<div class="product">
<h3>{{ product.name }}</h3>
<p>原价: <del>{{ product.price|floatformat:2 }}元</del></p>
<p>折扣价: {{ product.price|multiply:0.8|floatformat:2 }}元</p>
<p>库存: {{ product.stock|default:"暂时缺货" }}</p>
</div>
{% endfor %}
过滤器链[编辑 | 编辑源代码]
可以串联多个过滤器,执行顺序从左到右:
{{ " HELLO "|lower|truncatechars:5|title }} <!-- 输出 "He..." -->
高级特性[编辑 | 编辑源代码]
条件过滤[编辑 | 编辑源代码]
通过 default_if_none
和 default
处理空值:
{{ user.bio|default:"暂无简介" }} <!-- 仅当bio为False时触发 -->
{{ user.bio|default_if_none:"暂无简介" }} <!-- 仅当bio为None时触发 -->
安全相关[编辑 | 编辑源代码]
使用 escape
或 safe
过滤器控制HTML转义:
{{ "<script>alert('xss')</script>"|escape }} <!-- 输出转义后的HTML -->
{{ "<strong>安全内容</strong>"|safe }} <!-- 输出原始HTML -->
性能考虑[编辑 | 编辑源代码]
过滤器在模板渲染时实时计算,频繁使用的复杂逻辑建议在视图中预处理。例如:
- 避免:
模板:Large list
- 推荐:在视图中预先切片和拼接字符串
总结[编辑 | 编辑源代码]
Django的变量和过滤器系统提供了灵活的数据展示能力。关键要点:
- 变量语法:
模板:Variable
- 过滤器语法:
模板:Variable
- 过滤器可串联、带参数
- 内置过滤器覆盖常见需求,支持自定义扩展
- 注意安全性和性能优化
通过合理组合变量和过滤器,可以显著减少模板中的业务逻辑,保持代码清晰。