Django模板 - 将字符串拆分为数组

时间:2011-11-29 20:50:19

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

我有一个模型字段,它存储了一个URL列表(是的,我知道,这是错误的方式)url1\nurl2\nurl3<...>。我需要将字段拆分为模板中的数组,因此我创建了自定义过滤器:

@register.filter(name='split')
def split(value, arg):
    return value.split(arg)

我这样使用它:

{% with game.screenshots|split:"\n" as screens %}
        {% for screen in screens %}
            {{ screen }}<br>
        {% endfor %}
    {% endwith %}

但正如我所看到的,split不想工作:我得到像url1 url2 url3这样的输出(如果我查看源代码,则会显示换行符)。为什么呢?

5 个答案:

答案 0 :(得分:64)

Django故意遗漏了许多类型的模板标签,以阻止您在模板中进行过多处理。 (不幸的是,人们通常只是自己添加这些类型的模板标签。)

这是应该在模型而不是模板中的完美示例。

class Game(models.Model):
    ...
    def screenshots_as_list(self):
        return self.screenshots.split('\n')

然后,在您的模板中,您只需:

{% for screen in game.screenshots_as_list %}
    {{ screen }}<br>
{% endfor %}

更清晰,更容易使用。

答案 1 :(得分:12)

linkebreaksbr已存在功能:

{{ value|linebreaksbr }}

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#linebreaksbr

答案 2 :(得分:4)

嗯,我已经部分解决了这个问题。我将过滤器更改为:

@register.filter(name='split')
def split(value, arg):
    return value.split('\n')

为什么它不适用于原始代码?

答案 3 :(得分:1)

我想分割一个单词列表来获取字数,结果发现有一个过滤器:

{{ value|wordcount }}

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#wordcount

答案 4 :(得分:0)

除了你的原始解决方案是否是正确的方法之外,我猜原始代码不起作用,因为\n在Python代码中的含义与HTML中的含义不同:在Python代码中它意味着转义的换行符,在HTML中,它只是两个单独的字符\n。 因此,将输入参数\n从HTML模板传递到Python代码等同于拆分Python字符串\\n:文字\后跟n