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

int*_*_32 39 django django-templates django-template-filters

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

@register.filter(name='split')
def split(value, arg):
    return value.split(arg)
Run Code Online (Sandbox Code Playgroud)

我用这种方式:

{% with game.screenshots|split:"\n" as screens %}
        {% for screen in screens %}
            {{ screen }}<br>
        {% endfor %}
    {% endwith %}
Run Code Online (Sandbox Code Playgroud)

但正如我所看到的,split不想工作:我得到的输出url1 url2 url3(如果我查看源代码,则使用换行符).为什么?

Chr*_*att 69

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

这是一个完美的例子,应该在你的模型中,而不是你的模板.

class Game(models.Model):
    ...
    def screenshots_as_list(self):
        return self.screenshots.split('\n')
Run Code Online (Sandbox Code Playgroud)

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

{% for screen in game.screenshots_as_list %}
    {{ screen }}<br>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

更清晰,更容易使用.

  • 但请记住,过度肥胖的模型可能会成为一堆难以维护的东西.这种特殊情况是有效的 - 您可以将一些序列化数据转换为Python,这在模型层上是有意义的.(你甚至可以将该方法设为计算属性.)但是,如果你想在你的模型上放一个方法*只是*以便你可以从你的模板中调用它,那么请三思而后行 - 也许可以这样做在您的视图中处理:) (5认同)

pet*_*erp 13

功能已经存在linkebreaksbr:

{{ value|linebreaksbr }}
Run Code Online (Sandbox Code Playgroud)

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

  • 不,我不需要简单地将它们格式化为 HTML,我需要明确地将它拆分到列表中才能使用它。 (3认同)

int*_*_32 5

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

@register.filter(name='split')
def split(value, arg):
    return value.split('\n')
Run Code Online (Sandbox Code Playgroud)

为什么它与原始代码不兼容?