前言
django的自定义标签和过滤器
在 Django 中,自定义标签(Custom Tags) 和 自定义过滤器(Custom Filters) 是扩展模板功能的重要方式,允许你在模板中执行自定义逻辑。以下是它们的详细用法和区别:
1. 自定义过滤器(Custom Filters)
过滤器用于对变量进行简单处理(如格式化、计算等),语法为 {{ variable|filter_name:arg }}。
1 创建自定义过滤器
(1) 在 app 目录下创建 templatetags 文件夹
yourapp/
├── templatetags/
│ ├── __init__.py
│ └── custom_filters.py # 自定义过滤器文件
├── models.py
└── ...
(2) 编写过滤器
# custom_filters.py
from django import template
register = template.Library() # 必须命名为 register
@register.filter(name='add_suffix') # 注册过滤器,name 指定模板中使用的名称
def add_suffix(value, suffix):
"""在字符串后添加后缀"""
return f"{value}_{suffix}"
# 可以不带 name 参数,默认使用函数名
@register.filter
def multiply(value, arg):
"""数值乘法"""
return value * arg
(3) 在模板中使用
{% load custom_filters %} <!-- 先加载自定义过滤器 -->
{{ "hello"|add_suffix:"world" }} <!-- 输出:hello_world -->
{{ 5|multiply:3 }} <!-- 输出:15 -->
2、自定义标签(Custom Tags)
1. 作用
- 执行复杂逻辑:如数据库查询、条件分支、循环控制。
- 生成任意内容:返回 HTML 片段或动态数据。
2.创建自定义标签
(1) 简单标签(返回字符串)
# myapp/templatetags/custom_tags.py
from django import template
register = template.Library()
@register.simple_tag
def current_time(format_str):
"""返回当前时间的标签"""
from datetime import datetime
return datetime.now().strftime(format_str)
@register.simple_tag(takes_context=True)
def user_greeting(context):
"""基于上下文的标签"""
user = context['request'].user
return f"Hello, {user.username}!"
(2) 包含标签(渲染子模板)
@register.inclusion_tag('components/alert.html')
def show_alert(message, alert_type="info"):
"""渲染 Alert 组件"""
return {'message': message, 'type': alert_type}
子模板 components/alert.html:
<div class="alert alert-{{ type }}">
{{ message }}
</div>
(3) 在模板中使用
{% load custom_tags %}
<!-- 简单标签 -->
<p>{% current_time "%Y-%m-%d %H:%M" %}</p>
<!-- 包含标签 -->
{% show_alert "This is important!" "danger" %}