如何向Django自定义模板过滤器传递三个变量?
Django自定义过滤器传递多参数的解决方案
当然支持传递多个参数到自定义过滤器啦!不过你当前的模板写法有问题,导致参数没有被正确解析,我来帮你搞定:
问题根源
你写的模板代码:
{{ item.cost|pay_blago:'{{item.can_pay_blago_to_currency}}, {{item.rest}}'}}
这里的{{item.can_pay_blago_to_currency}}和{{item.rest}}是被包裹在字符串引号里的,模板引擎不会解析它们,过滤器最终收到的是字面量字符串"{{item.can_pay_blago_to_currency}}, {{item.rest}}",而不是这两个变量的实际值,这就是为什么你的split(',')输出不符合预期。
方案一:直接传递多个参数(推荐)
Django支持直接给过滤器传递多个参数,只要你的过滤器函数定义对应数量的参数,模板里用冒号:依次分隔参数即可:
模板代码
{{ item.cost|pay_blago:item.can_pay_blago_to_currency:item.rest }}
过滤器函数
from django import template register = template.Library() @register.filter def pay_blago(cost, can_pay_blago_to_currency, rest): # 现在你可以直接使用三个参数了 print(f"成本: {cost}, 可支付币种: {can_pay_blago_to_currency}, 剩余金额: {rest}") # 在这里编写你的业务逻辑,最后返回处理后的结果 return ...
方案二:拼接参数字符串后拆分(适用于参数较多的场景)
如果需要传递更多参数,或者需要动态拼接参数,可以先把多个变量拼成一个字符串,再传递给过滤器,最后在函数里拆分:
模板代码(用with标签拼接更清晰)
{% with args=f"{item.can_pay_blago_to_currency},{item.rest}" %} {{ item.cost|pay_blago:args }} {% endwith %}
或者用add过滤器拼接(适合字符串类型参数):
{{ item.cost|pay_blago:item.can_pay_blago_to_currency|add:","|add:item.rest }}
过滤器函数
from django import template register = template.Library() @register.filter def pay_blago(cost, args): # 拆分参数,注意去除可能的空格 can_pay, rest = [arg.strip() for arg in args.split(',')] # 如果参数是数字类型,记得转换类型,比如: # can_pay = float(can_pay) # rest = int(rest) print(f"成本: {cost}, 可支付币种: {can_pay}, 剩余金额: {rest}") # 编写处理逻辑并返回结果 return ...
两种方案都能解决你的问题,推荐用第一种,代码更直观易维护~
内容的提问来源于stack exchange,提问作者user11301070
相关产品推荐
相关产品推荐

