我有一个模型字段,它存储了一个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
这样的输出(如果我查看源代码,则会显示换行符)。为什么呢?
答案 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
。