如何向Django custom template tag传递多个参数multiple arguments
问题解答
现有写法可行性说明
你目前的多参数传递写法不可行,Django模板过滤器的语法默认仅支持传递1个额外参数,逗号分隔多参数的写法无法被模板引擎正确解析。
正确实现方式
方案1:过滤器参数打包(变通实现)
如果要坚持用过滤器实现,需要把多个参数提前打包为元组/列表后再传递:
- 视图层逻辑:在返回模板的context中新增参数包
# 视图函数中添加到context context = { # 其他原有参数 "filter_args": (rooms, request.user.id) } - 模板写法调整:
{% for right in people_rights|user_available_rights:filter_args %} {{right.room}} {% endfor %} - 过滤器代码调整(增加拆包逻辑):
from django import template register = template.Library() @register.filter def user_available_rights(rights, args): # 拆包获取两个参数 rooms, user_id = args available_rights = [] user_rooms = [right.room for right in rights if right.user.id == user_id] # 优化原有嵌套循环逻辑,避免重复添加房间 available_rights = [room for room in rooms if room not in user_rooms] return available_rights
方案2:使用simple_tag(更推荐)
Django的自定义简单标签原生支持多参数传递,不需要额外打包参数,写法更清晰:
- 自定义标签代码:
from django import template register = template.Library() @register.simple_tag def get_user_available_rights(rights, rooms, user_id): user_rooms = [right.room for right in rights if right.user.id == user_id] return [room for room in rooms if room not in user_rooms] - 模板写法调整:
{# 先调用标签获取结果,存入变量 #} {% get_user_available_rights people_rights rooms user.id as available_rights %} {% for right in available_rights %} {{ right.room }} {% endfor %}
内容的提问来源于stack exchange,提问作者kakakakakakakk
相关产品推荐
相关产品推荐

