django的自定义标签和过滤器


前言

       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" %}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值