在 Django 中使用模板标签过滤二维列表
Filter 2D list with template tag in Django
我正在尝试编写一个模板标签来过滤二维列表。
这是我的模板标签:
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" (|
) 字符传递的,另一个是可选的额外参数,比如在 documentation [Django-doc]:
Custom filters are just Python functions that take one or two
arguments:
- The value of the variable (input) – not necessarily a string.
- The value of the argument – this can have a default value, or be left out altogether
但是我们可以让组件更加可重用,从而每次获取一个元素,比如:
from django import template
register = template.Library()
@register.filter
def <b>index</b>(seq, position):
return seq[position]
那么我们可以这样写:
{{ summary|<b>index:0|index:0</b> }}
所以现在我们可以使用index
来获取列表的一个元素,并且通过链接,我们可以更深入地研究列表。因此,我们使函数更具可重用性。
此技术与函数式编程中的柯里化有些相关,其中函数总是只接受一个参数。
或者,您可以使用某种可以解码的格式,例如包含逗号分隔值的字符串:
from django import template
register = template.Library()
@register.filter
def <b>index_two</b>(seq, positions):
p1, p2 = map(int, positions.split(','))
return seq[p1][p2]
然后像这样使用它:
{{ summary|<b>index_two:'0,0'</b> }}
但我个人觉得这不太优雅,并且可能会引起更多麻烦,因为它需要一个定义良好的格式,并且它总是有可能在某些特殊情况下失败。
此答案的灵感来自 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'}
我正在尝试编写一个模板标签来过滤二维列表。
这是我的模板标签:
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" (|
) 字符传递的,另一个是可选的额外参数,比如在 documentation [Django-doc]:
Custom filters are just Python functions that take one or two arguments:
- The value of the variable (input) – not necessarily a string.
- The value of the argument – this can have a default value, or be left out altogether
但是我们可以让组件更加可重用,从而每次获取一个元素,比如:
from django import template
register = template.Library()
@register.filter
def <b>index</b>(seq, position):
return seq[position]
那么我们可以这样写:
{{ summary|<b>index:0|index:0</b> }}
所以现在我们可以使用index
来获取列表的一个元素,并且通过链接,我们可以更深入地研究列表。因此,我们使函数更具可重用性。
此技术与函数式编程中的柯里化有些相关,其中函数总是只接受一个参数。
或者,您可以使用某种可以解码的格式,例如包含逗号分隔值的字符串:
from django import template
register = template.Library()
@register.filter
def <b>index_two</b>(seq, positions):
p1, p2 = map(int, positions.split(','))
return seq[p1][p2]
然后像这样使用它:
{{ summary|<b>index_two:'0,0'</b> }}
但我个人觉得这不太优雅,并且可能会引起更多麻烦,因为它需要一个定义良好的格式,并且它总是有可能在某些特殊情况下失败。
此答案的灵感来自 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'}