如何判断值是Django模板中的字符串还是列表?

Gre*_*nch 2 python django templates django-templates

我有一个值的元组,我正在Django模板中迭代(1.4).一些值是必须打印出来的字符串,其他值是包含字符串的元组,必须自己迭代才能打印出它们的值.在模板中是否有一种方法可以决定,当我迭代主元组时,给定值是字符串还是列表(元组)?

bru*_*ers 7

没有内置的方法可以做到这一点.一个(有点脏的恕我直言)解决方法是实现自定义的"is_string"过滤器,但最好的解决方案是预处理视图中的值,使其成为元组(或列表)的统一列表.

对于过滤解决方案:

@register.filter
def is_string(val):
    return isinstance(val, basestring)
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中:

<ul> 
{% for whatever in something %}
  <li>
    {% if whatever|is_string %} 
      {{ whatever }}
    {% else %}
    <ul>
      {{ whatever|unordered_list }}
    </ul>
    {% endif %}
  </li>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

有关自定义过滤器和模板标签的更多信息,请参阅优秀的Django文档:https: //docs.djangoproject.com/en/1.4/howto/custom-template-tags/


mVC*_*Chr 5

您可以isinstance在视图或帮助程序模块中创建过滤器:

from django.template.defaultfilters import register

@register.filter(name="isinstance")
def isinstance_filter(val, instance_type):
    return isinstance(val, eval(instance_type))
Run Code Online (Sandbox Code Playgroud)

然后在模板中你可以做到:

{% load isinstance %}
{% if some_value|isinstance:"list" %}
  // iterate over list
{% else %}
  // use string
{% endif %}
Run Code Online (Sandbox Code Playgroud)

  • 这里的'评估'是一个很大的禁忌 - 它的成本很高,而且这是一个潜在的安全问题.这不会通过代码审查. (4认同)