在Django模板中检查列表中是否存在

63
我想检查一个值是否属于Django模板中的列表。类似这样:{% if value in ['Pass', 'Fail'] %} 我该怎么做?

很遗憾,Django不支持这个。 - guettli
4个回答

101

我认为你不能直接在模板中定义列表。你可以将一个列表传递到模板中,并执行:

{% if value in my_list %}
例如:
{% if name in 'foo,bar' %}
    bla
{% endif %}

或者,您可以编写一个模板标签,像这样使用参数:

{% ifinlist value "val1,val2,val3" %}

7
@sunnyiitkgp,Django默认情况下不存在@ifinlist。您可以自己编写模板标签。 - Nrzonline
7
可以通过展示完整解决方案来改进答案,即如何设置和将my_list传递到模板中,或者如何编写ifinlist函数。 - Hack-R
3
这里的 'foo,bar' 示例不适用/不正确,因为 'foo,bar' 是一个字符串,而不是一个列表。 - Jan Kyu Peblik
在这种情况下,如果名字在'foo,bar'中,则name='o,b'会评估为True!!!这是我们想要的吗? - tveronesi
问题是,如果你检查 {% if 'foo' in 'foo_bar,fool' %},它仍然是真的。因为 "in" 不在乎逗号,它只是检查字符串 'foo_bar,fool' 中是否存在 'foo'。 - JJaun

25

你可以这样写if条件:

{% if value in '通过,未通过' %}

无需来自后端的模板标签或列表


请查看文档。在 Django 模板中无法执行此操作,您需要先创建一个列表。 - Emilio Conte
@EmilioConte 这个方法对于字符串列表(如问题中所述)有效,可以参考in操作符的文档。例如,如果value = 'Pass',那么'Pass'是'Pass,Fail'的子字符串。 - YPCrumble
2
@YPCrumble 'Pass,Fail' 不是字符串列表,而是一个字符串本身。这种方法适用于测试 value 是否属于一系列字符。OP的问题是关于一个列表而不是一个str。但你是对的,我错了,这是一种有效的方法,我会删除这个无用的帖子。 - Emilio Conte
6
如果您不关心匹配子字符串,那么这实际上只是有效的。例如,对于“Pass,Fail”中的任何一个“item”,if 'a' in 'Pass,Fail'都会返回True。因此,它仅适用于简单、不同的逗号分隔字符字符串。 - Jan Kyu Peblik
这不太好,当我有三个字符串“长剑”、“剑”和“短剑”时。如果值是“剑”,并且在“长剑、短剑”中,它将返回True,但实际上应该是false。 - Hasyidan Paramananda

12

Django模板:

{% value|ifinlist:"val1,val2,val3" %}

模板标签:

from django import template

register = template.Library()

@register.filter(name='ifinlist')
def ifinlist(value, list):
    return value in list

2
参数不应该被称为 list - 它会掩盖内置名称。 - maciejwww

2
如何将列表传递到模板中?我个人在通用视图中使用extra_context属性,例如:

class MyObjectDetailView(DetailView):
    model = MyObject
    template_name = "path/to/object_detail.html"
    extra_context = {'DISABLED': [model.ACCEPTED, model.REFUSED]}


在我的模板中,例如,要禁用btn:

<input class="btn"{% if object.status in DISABLED %} disabled="disabled"{% endif %}">


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接