如何判断一个值是 Django 模板中的字符串还是列表?
Posted
技术标签:
【中文标题】如何判断一个值是 Django 模板中的字符串还是列表?【英文标题】:How can I tell if a value is a string or a list in Django templates? 【发布时间】:2012-07-05 06:06:55 【问题描述】:我在 Django 模板 (1.4) 中迭代了一组值。其中一些值是必须打印出来的字符串,另一些是包含字符串的元组,必须对其自身进行迭代才能打印出它们的值。有没有办法在模板中确定给定值在我迭代主元组时是字符串还是列表(元组)?
【问题讨论】:
if isinstance(val, list) ... else ...
应该可以工作
@TimmyO'Mahony:不在 Django 模板中
@TimmyO'Mahony :最好针对基本字符串进行测试 - 通常对于此类问题,您想知道它是字符串还是任何其他类型的序列。
对不起,错过了模板部分!
【参考方案1】:
没有内置的方法可以这样做。一个(恕我直言)的解决方法是实现一个自定义的“is_string”过滤器,但最好的解决方案是预处理视图中的值,使其成为一个统一的元组列表(或列表)。
对于过滤器解决方案:
@register.filter
def is_string(val):
return isinstance(val, basestring)
然后在您的模板中:
<ul>
% for whatever in something %
<li>
% if whatever|is_string %
whatever
% else %
<ul>
whatever|unordered_list
</ul>
% endif %
</li>
% endfor %
</ul>
请参阅优秀的 Django 文档,了解有关自定义过滤器和模板标签的更多信息:
https://docs.djangoproject.com/en/stable/howto/custom-template-tags/
【讨论】:
谢谢,这正是我所需要的【参考方案2】:您可以在视图或帮助模块中创建isinstance
过滤器:
from django.template.defaultfilters import register
@register.filter(name="isinstance")
def isinstance_filter(val, instance_type):
return isinstance(val, eval(instance_type))
然后在模板中你可以这样做:
% load isinstance %
% if some_value|isinstance:"list" %
// iterate over list
% else %
// use string
% endif %
【讨论】:
这里的“评估”是一个很大的禁忌——它的成本很高,而且是一个潜在的安全问题。这不会通过这里的代码审查。 @brunodesthuilliers:它可以做得更快,但它是一个安全问题吗? @Blender 试试这个:% if some_value|isintance:"os.system('rm -rf ./')" %
当然你不会写这个,但是如果有人设法将不受信任的输入传递给eval
...好吧,我想你明白了跨度>
@brunodesthuilliers:那还有什么选择呢? __builtins__[instance_type]
?白名单?我知道eval
是一个潜在 安全风险,但在这种情况下,为什么会有人将用户输入传递给它呢?
@Blender 真正的解决方案是要么知道您要发送到模板的(类型)值,要么传递知道如何显示自己的值(或至少为模板提供所需的信息)关于他们自己)。至于为什么有人会将原始用户输入传递给模板过滤器,你有没有想过为什么有些网站仍然存在 sql 注入漏洞?以上是关于如何判断一个值是 Django 模板中的字符串还是列表?的主要内容,如果未能解决你的问题,请参考以下文章