繁体   English   中英

在Django中使用模板标签过滤2D列表

[英]Filter 2D list with template tag in Django

我正在尝试编写一个模板标签来过滤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个。

我已尝试将模板标签调整为此处的答案,但我无法使其正常工作。

有什么建议么?

谢谢

Django模板过滤器最多包含两个参数(一个通过“ pipe”( | )字符传递的参数,以及一个可选的额外参数,如[Django-doc]文档中指定的那样:

自定义过滤器只是采用一两个参数的Python函数:

  1. 变量(输入)的值–不一定是字符串。
  2. 参数的值–可以具有默认值,也可以完全省略

但是我们可以使组件更可重用,从而每次都获得一个元素,例如:

from django import template

register = template.Library()

@register.filter
def index(seq, position):
    return seq[position]

然后我们可以这样写:

{{ summary|index:0|index:0 }}

因此,现在我们可以使用index来获取列表的元素,并且通过链接,我们可以更深入地研究列表。 因此,我们使该功能更具可重用性。

此技术与函数编程中的curring有关,在函数编程中,函数始终仅使用一个参数。

或者,您可以使用某种可以解码的格式,例如包含逗号分隔值的字符串:

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' }}

但是我个人觉得这不太优雅,并且可能会带来更多麻烦,因为它需要一种格式明确的格式,并且在某些极端情况下总是有可能失败。

这个答案的灵感来自威廉·范·昂塞姆(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'}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM