如何在Django模板中向带多个as参数的模板标签传递多参数?
问题核心
你这个错误的根源是没搞懂Django模板标签里as的用法:
simple_tag只能返回单个结果,as的作用是把这个完整的返回值赋值给一个变量,没法拆分参数或者返回值同时给多个变量。- 你写的
{% test "Anna" as f_name "Miller" as l_name %}完全不符合语法:as是标签的后缀,每个标签只能用一次as,而且所有参数必须放在as前面。你这种穿插参数和as的写法,会被Django当成多余的位置参数,所以才报“参数过多”的错。
解决办法
要分别拿到名和姓,得改自定义标签的返回值,让它能装下多个数据,之后在模板里拆出来用:
方案1:返回元组,按索引取值
修改标签代码:
from django.template import Library register = Library() @register.simple_tag def test(first_name="John", last_name="Smith"): # 返回存有名和姓的元组 return first_name, last_name
模板里这么用:
{% test "Anna" "Miller" as name_pair %} {{ name_pair.0 }} {{ name_pair.1 }}
输出就是:Anna Miller
方案2:返回字典,按键取值
修改标签代码:
from django.template import Library register = Library() @register.simple_tag def test(first_name="John", last_name="Smith"): # 返回存有名和姓的字典 return {"first": first_name, "last": last_name}
模板里这么用:
{% test "Anna" "Miller" as name_info %} {{ name_info.first }} {{ name_info.last }}
输出同样是:Anna Miller
额外说明
- 你原来的标签返回的是拼接好的全名字符串,所以哪怕用
as也只能拿到整个名字,拆不开。必须让标签返回能存多个值的结构(元组、字典都行)才行。 - 记住:一个模板标签最多只能用一次
as,用来捕获它的整个返回值,这是Django的语法规则。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

