我已经看到,firstof
与as
一起使用后,列表数据类型不会保留其结构。例如:
{% firstof some_list some_string as value %}
如果some_list
是上面的有效列表,则会将其分配给value
。但是,如果我执行{% if pk in value %}
之类的操作,即使成功使用{% if pk in some_list %}
,它也会失败。当我打印它们时:
{{some_list}}
{{value}}
他们提供相同的输出,但我认为在firstof
与as
一起使用后,列表可能不会存储为列表。想法?
答案 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'>
仔细看documentation,firstof
:
输出第一个非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 %}
我希望对您有帮助