Шаблоны Django - разделение строки на массив
У меня есть поле модели, в котором хранится список 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
(с разрывами строк, если я смотрю на источник). Почему?
Ответы
Ответ 1
Django намеренно не учитывает многие типы templatetags, чтобы препятствовать тому, чтобы вы делали слишком много обработки в шаблоне. (К сожалению, люди обычно просто добавляют эти типы templatetags сами.)
Это прекрасный пример того, что должно быть в вашей модели, а не в вашем шаблоне.
class Game(models.Model):
...
def screenshots_as_list(self):
return self.screenshots.split('\n')
Затем в вашем шаблоне вы просто выполните:
{% for screen in game.screenshots_as_list %}
{{ screen }}<br>
{% endfor %}
Гораздо понятнее и намного легче работать.
Ответ 2
Функциональность уже существует с linkebreaksbr
:
{{ value|linebreaksbr }}
https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#linebreaksbr
Ответ 3
Hm, я частично решил эту проблему. Я изменил свой фильтр на:
@register.filter(name='split')
def split(value, arg):
return value.split('\n')
Почему это не сработало с исходным кодом?
Ответ 4
Я хотел разбить список слов, чтобы получить количество слов, и, оказывается, для этого есть фильтр:
{{ value|wordcount }}
https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#wordcount