首先使用列表变量

时间:2017-10-18 11:08:11

标签: django django-templates django-template-filters

我已经看到,firstofas一起使用后,列表数据类型不会保留其结构。例如:

{% firstof some_list some_string as value %}

如果some_list是上面的有效列表,则会将其分配给value。但是,如果我执行{% if pk in value %}之类的操作,即使成功使用{% if pk in some_list %},它也会失败。当我打印它们时:

{{some_list}}
{{value}}

他们提供相同的输出,但我认为在firstofas一起使用后,列表可能不会存储为列表。想法?

2 个答案:

答案 0 :(得分:1)

some_list分配给value并不如预期的那样有效。生成的value属于SafeText类型而非list。可以使用this answer来检查,这会添加自定义模板标记get_type以获取变量的类型。

{% firstof some_list as value %}
{{ some_list|get_type }}
{{ value|get_type }}

其中显示以下内容:

<class 'list'>
<class 'django.utils.safestring.SafeText'>

仔细看documentationfirstof

  

输出第一个非False的参数变量。

他们的示例显示{% firstof some_list some_string %}变为:

{% if some_list %}
    {{ some_list }}
{% elif some_string %}
    {{ some_string }}
{% endif %}

这解释了为什么value属于SafeText类型。赋值只是将其赋值给变量value。这似乎不是我的错误。

答案 1 :(得分:0)

我还需要该功能,以从多个项中获取第一个没有null的项(包括列表)并将其分配给变量,因此我创建了一个简单的标签

@register.simple_tag
def firstofany(*args_list):
    i = 0
    for arg in args_list:
        if arg or i == len(args_list)-1:
            return arg
        else:
            pass

然后在模板中使用

{% firstof some_list some_string as value %}

{% firstofany some_list some_string last_as_default as value %}

我希望对您有帮助