Шаблоны Django-разделить строку на массив
у меня есть поле модели, в котором хранится список URL-адресов (да, я знаю, что это неправильно) как url1nurl2nurl3<...>
. Мне нужно разделить поле на массив в моем шаблоне, поэтому я создал пользовательский фильтр:
@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
(С linebreaks, если я посмотрю на источник). Почему?
5 ответов
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 %}
очень ясный и гораздо легке для работы С.
функциональность уже существует с linkebreaksbr
:
{{ value|linebreaksbr }}
https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#linebreaksbr
тю, я частично решил эту проблему. Я изменил свой фильтр на:
@register.filter(name='split')
def split(value, arg):
return value.split('\n')
почему он не работает с исходным кодом?
Я хотел разделить список слов, чтобы получить количество слов, а оказывается есть фильтр для этого:
{{ value|wordcount }}
https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#wordcount
помимо того, было ли ваше исходное решение правильным подходом, я думаю, исходный код не работал, потому что значение \n
не то же самое в коде Python, что и в HTML: в коде Python это означает экранированный символ новой строки, в HTML это всего лишь два отдельных символа \
и n
.
Поэтому в качестве входного параметра \n
из шаблона HTML в код Python эквивалентно разбиению на строку Python \n
: литерал \
затем n
.