Шаблоны 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.