You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模板中如何拼接字符串将变量传入过滤器参数?

问题描述

在Django模板中使用get_current_language实现flatpickr组件本地化时,需要将获取到的语言码传入set_data过滤器参数,最初尝试的代码如下:

{% get_current_language as LANGUAGE_CODE %}

{{ field|set_data:'flatpickr:{"locale": LANGUAGE_CODE}' }}

由于set_data过滤器的入参要求为字符串类型,直接在参数字符串内写入LANGUAGE_CODE变量无法被Django模板引擎解析,无法正确传值。

后续尝试通过多过滤器链式调用实现需求,先自定义了两个模板过滤器:

@register.filter(is_safe=True)
def fp_i18n(args, locale):
    config = ", ".join(args + [f'"locale:{locale}"'])
    return f'flatpickr:{ {config} }'


@register.filter(is_safe=True)
def fp_args(field, config):
    return config.replace(" ", "").split(",")

在HTML模板中按如下方式链式调用过滤器:

{{ field|set_data:''|fp_args:'"altInput":true, "altFormat": "d/m/Y", "allowInput":true'|fp_i18n:LANGUAGE_CODE }}

最终fp_i18n过滤器返回的结果为:

'flatpickr:{\'"altInput":true, "altFormat":"d/m/Y", "allowInput":true, "locale:it"\'}'

该返回内容被直接打印到HTML页面上,没有实现预期的元素属性设置效果。

错误原因

之前的实现有三个核心问题:

  • 过滤器调用顺序错误:先调用set_data:''相当于一开始就给field设置了空的data属性,后续的fp_args、fp_i18n只是对set_data的返回值做字符串处理,不会再修改field的属性,最终处理完的字符串会被直接渲染到页面。
  • 配置拼接逻辑错误:f'"locale:{locale}"'把键名locale和语言码值包在了同一个双引号内,正确格式应该是"locale": "语言码"。
  • 格式生成错误:f'flatpickr:{ {config} }'里的内层{config}是Python集合语法,转字符串时会自动额外生成大括号和单引号,完全不符合JSON配置要求。
正确实现方案

不要手动拼接JSON字符串,很容易出现引号、逗号格式错误,直接用Python内置的json模块序列化配置,同时把set_data放在过滤器链的最后一位,接收前面生成好的完整配置参数。

最简洁的实现是写一个专门生成flatpickr配置的过滤器,覆盖常规使用场景:

import json
from django import template

register = template.Library()

@register.filter(is_safe=True)
def flatpickr_with_locale(field, locale_code):
    # 直接定义基础配置字典,注入语言码
    config = {
        "altInput": True,
        "altFormat": "d/m/Y",
        "allowInput": True,
        "locale": locale_code
    }
    # 序列化为标准JSON字符串,拼接成set_data要求的参数格式
    set_data_arg = f"flatpickr:{json.dumps(config)}"
    return field|set_data:set_data_arg

模板中按如下方式调用即可:

{% get_current_language as LANGUAGE_CODE %}
{{ field|flatpickr_with_locale:LANGUAGE_CODE }}

如果需要灵活传入不同的基础配置,不想把配置写死在过滤器里,可以拆分配置处理逻辑,配合模板标签使用:

import json
from django import template

register = template.Library()

@register.filter(is_safe=True)
def add_locale_to_config(config_str, locale_code):
    # 解析传入的JSON配置字符串为字典
    config = json.loads(config_str)
    # 注入语言配置
    config["locale"] = locale_code
    # 返回set_data需要的标准格式参数
    return f"flatpickr:{json.dumps(config)}"

模板调用示例:

{% get_current_language as LANGUAGE_CODE %}
{% with fp_config='{"altInput":true, "altFormat": "d/m/Y", "allowInput":true}'|add_locale_to_config:LANGUAGE_CODE %}
{{ field|set_data:fp_config }}
{% endwith %}

内容的提问来源于stack exchange,提问作者realnot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:15:42