跳转到内容

Django变量和过滤器

来自代码酷
Admin留言 | 贡献2025年5月1日 (四) 01:48的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

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模板引擎按以下顺序解析变量:

  1. 字典键查找(如 模板:User.name 对应 user['name']
  2. 属性查找(如 模板:User.name 对应 user.name
  3. 列表/元组索引查找(如 模板: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_nonedefault 处理空值:

{{ user.bio|default:"暂无简介" }}          <!-- 仅当bio为False时触发 -->
{{ user.bio|default_if_none:"暂无简介" }} <!-- 仅当bio为None时触发 -->

安全相关[编辑 | 编辑源代码]

使用 escapesafe 过滤器控制HTML转义:

{{ "<script>alert('xss')</script>"|escape }}  <!-- 输出转义后的HTML -->
{{ "<strong>安全内容</strong>"|safe }}        <!-- 输出原始HTML -->

性能考虑[编辑 | 编辑源代码]

过滤器在模板渲染时实时计算,频繁使用的复杂逻辑建议在视图中预处理。例如:

总结[编辑 | 编辑源代码]

Django的变量和过滤器系统提供了灵活的数据展示能力。关键要点:

  • 变量语法:模板:Variable
  • 过滤器语法:模板:Variable
  • 过滤器可串联、带参数
  • 内置过滤器覆盖常见需求,支持自定义扩展
  • 注意安全性和性能优化

通过合理组合变量和过滤器,可以显著减少模板中的业务逻辑,保持代码清晰。