43 votes

Modèles Django - diviser la chaîne en tableau

J'ai un champ modèle, qui stocke une liste d'URL (oui, je sais, c'est dans le mauvais sens) sous la forme url1\nurl2\nurl3<...> . J'ai besoin de diviser le champ en un tableau dans mon modèle, j'ai donc créé le filtre personnalisé :

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

Je l'utilise de cette façon :

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

mais comme je peux le voir, split ne veut pas fonctionner : j'obtiens une sortie comme url1 url2 url3 (avec des sauts de ligne si je regarde la source). Pourquoi?

84voto

Chris Pratt Points 53859

Django omet intentionnellement de nombreux types de balises de modèle pour vous décourager de faire trop de traitement dans le modèle. (Malheureusement, les gens ajoutent généralement eux-mêmes ces types de balises de modèle.)

C'est un exemple parfait de quelque chose qui devrait être dans votre modèle et non dans votre modèle.

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

Ensuite, dans votre modèle, vous faites simplement :

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

Beaucoup plus clair et beaucoup plus facile à travailler.

13voto

peterp Points 1136

La fonctionnalité existe déjà avec linkebreaksbr :

 {{ value|linebreaksbr }}

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

7voto

RankoR Points 1286

Hum, j'ai en partie résolu ce problème. J'ai changé mon filtre pour :

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

Pourquoi cela n'a pas fonctionné avec le code d'origine ?

1voto

shootingstars Points 774

Je voulais diviser une liste de mots pour obtenir un nombre de mots, et il s'avère qu'il existe un filtre pour cela :

 {{ value|wordcount }}

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X