Шаблоны Django - разбить строку на массив - PullRequest
38 голосов
/ 30 ноября 2011

У меня есть поле модели, в котором список 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 %}

, но, как я вижу,Сплит не хочет работать: я получаю вывод вроде url1 url2 url3 (с разрывом строки, если я смотрю на источник).Почему?

Ответы [ 5 ]

64 голосов
/ 30 ноября 2011

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 %}

Намного понятнее и с ним гораздо проще работать.

12 голосов
/ 30 ноября 2011

Функциональность уже существует с linkebreaksbr:

{{ value|linebreaksbr }}

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

4 голосов
/ 30 ноября 2011

Хм, я частично решил эту проблему.Я изменил свой фильтр на:

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

Почему он не работал с исходным кодом?

1 голос
/ 30 ноября 2017

Я хотел разделить список слов, чтобы получить количество слов, и оказалось, что для этого есть фильтр:

{{ value|wordcount }}

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

0 голосов
/ 30 мая 2018

Помимо того, что ваше оригинальное решение было правильным, я думаю, оригинальный код не работал, потому что значение \n не то же самое в коде Python, как и в HTML: в коде Python это означает экранированныйсимвол перевода строки, в HTML это просто два отдельных символа \ и n.Поэтому передача в качестве входного параметра \n из шаблона HTML в код Python эквивалентна разбиению строки Python \\n: литерал \, за которым следует n.

...