Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django templates - split string to array

I have a model field, which stores a list of URLs (yeah, I know, that's wrong way) as url1\nurl2\nurl3<...>. I need to split the field into an array in my template, so I created the custom filter:

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

I use it this way:

{% with game.screenshots|split:"\n" as screens %}
        {% for screen in screens %}
            {{ screen }}<br>
        {% endfor %}
    {% endwith %}

but as I can see, split doesn't want to work: I get output like url1 url2 url3 (with linebreaks if I look at the source). Why?

like image 814
artem Avatar asked Nov 29 '11 20:11

artem


3 Answers

Django intentionally leaves out many types of templatetags to discourage you from doing too much processing in the template. (Unfortunately, people usually just add these types of templatetags themselves.)

This is a perfect example of something that should be in your model not your template.

class Game(models.Model):
    ...
    def screenshots_as_list(self):
        return self.screenshots.split('\n')

Then, in your template, you just do:

{% for screen in game.screenshots_as_list %}
    {{ screen }}<br>
{% endfor %}

Much more clear and much easier to work with.

like image 70
Chris Pratt Avatar answered Oct 24 '22 12:10

Chris Pratt


Functionality already exists with linkebreaksbr:

{{ value|linebreaksbr }}

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

like image 16
peterp Avatar answered Oct 24 '22 12:10

peterp


Hm, I have partly solved this problem. I changed my filter to:

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

Why it didn't work with the original code?

like image 8
artem Avatar answered Oct 24 '22 10:10

artem