it-swarm.com.ru

Шаблоны 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 (с разрывами строк, если я смотрю на источник). Зачем?

32
arts777

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

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

61
Chris Pratt

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

{{ value|linebreaksbr }}

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

12
peterp

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

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

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

4
arts777

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

{{ value|wordcount }}

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

1
ryanjdillon

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

0
Tim van der Leeuw