我正在尝试编写一个模板标签来过滤2D列表。
这是我的模板标签:
from django import template
register = template.Library()
@register.filter
def index_two(seq, position1, position2):
return seq[position1][position2]
这是我要传递给模板的列表:
summary = [[50, 0, 0], [50, 100, 100]]
我正尝试在摘要中引用第一个列表的第一个元素,就像这样:
{{summary|index_two:0 0}}
但是,我收到了模板语法错误:index_two需要3个参数,其中提供了2个。
我尝试将模板标签调整为答案here,但我无法使其正常工作。
有什么建议吗?
谢谢
答案 0 :(得分:1)
Django模板过滤器最多采用两个参数(一个用“ pipe”(|
)字符传递的参数,以及一个可选的额外参数,例如documentation [Django-doc]中指定的参数:< / p>
自定义过滤器只是需要一两个功能的Python函数 参数:
- 变量(输入)的值–不一定是字符串。
- 参数的值–该值可以具有默认值,也可以完全省略
但是我们可以使组件具有更高的可重用性,从而每次都获得一个元素,例如:
from django import template
register = template.Library()
@register.filter
def index(seq, position):
return seq[position]
然后我们可以这样写:
{{ summary|index:0|index:0 }}
因此,现在我们可以使用index
获取列表的元素,并且通过链接,我们可以更深入地研究列表。因此,我们使该功能更具可重用性。
这项技术与函数编程中的 currying 有点关系,在函数编程中,函数始终仅使用一个参数。
或者,您可以使用某种可以解码的格式,例如包含逗号分隔值的字符串:
from django import template
register = template.Library()
@register.filter
def index_two(seq, positions):
p1, p2 = map(int, positions.split(','))
return seq[p1][p2]
然后像这样使用它:
{{ summary|index_two:'0,0' }}
但是我个人觉得这不太优雅,并且可能会带来更多麻烦,因为它要求格式明确,并且在某些极端情况下总是有可能失败。
答案 1 :(得分:1)
此答案的灵感来自威廉·范·昂塞姆(Willem Van Onsem)的评论:
模板标签:
from django import template
register = template.Library()
@register.filter
def index(seq, pos):
position1 = int(pos.split(" ")[0])
position2 = int(pos.split(" ")[1])
return seq[position1][position2]
模板:
{{summary|index:'0 0'}