Django模板:测试变量是否在列表或字典中

Pau*_*aul 19 django templates

想知道是否有办法使用内置标签和过滤器测试变量是否在django中的列表或dict中.

即: {% if var|in:the_list %}

我没有在文档中看到它,如果没有,我会尝试自定义,但我不想做已经完成的事情.

谢谢

Dan*_*man 38

在Django 1.2中,你可以做到

{% if var in the_list %}
Run Code Online (Sandbox Code Playgroud)

就像在Python中一样.

否则是的,你将需要一个自定义过滤器 - 它是一个三线程,但:

@register.filter
def is_in(var, obj):
    return var in obj
Run Code Online (Sandbox Code Playgroud)

  • 列表可以在模板中,如:`{%if var in ['item1','item2','item3']%} (7认同)
  • @Sevenearths我刚刚尝试过,并且可以确认,从Django 1.5.1开始,列表**不能像那样在`if`语句中定义. (4认同)
  • 在上下文中传递它然后它将工作. (2认同)
  • @laycat:我们必须与上下文中给出的列表变量进行比较。顺便说一句:如何完全避免 Django 模板语言? (2认同)

dot*_*mly 6

想要从模板中传递逗号分隔的字符串吗?创建自定义模板标签:

from django import template
register = template.Library()

@register.filter
def in_list(value, the_list):
    value = str(value)
    return value in the_list.split(',')
Run Code Online (Sandbox Code Playgroud)

然后你可以这样称呼它:

{% if 'a'|in_list:'a,b,c,d,1,2,3' %}Yah!{% endif %}
Run Code Online (Sandbox Code Playgroud)

它也适用于变量:

{% if variable|in_list:'a,b,c,d,1,2,3' %}Yah!{% endif %}
Run Code Online (Sandbox Code Playgroud)