wake-up-neo.net

Django-Vorlagen - Zeichenfolge in Array aufteilen

Ich habe ein Modellfeld, in dem eine Liste von URLs (ja, ich weiß, das ist falsch) als url1\nurl2\nurl3<...> gespeichert wird. Ich muss das Feld in meiner Vorlage in ein Array aufteilen, also habe ich den benutzerdefinierten Filter erstellt:

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

Ich benutze es so:

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

aber wie ich sehen kann, möchte split nicht funktionieren: Ich bekomme eine Ausgabe wie url1 url2 url3 (mit Zeilenumbrüchen, wenn ich mir die Quelle anschaue). Warum?

32
arts777

Bei Django werden absichtlich viele Arten von Templatetags ausgelassen, um Sie davon abzuhalten, zu viel Verarbeitung in der Vorlage durchzuführen. (Unglücklicherweise fügen Leute diese Arten von Templatetags normalerweise selbst hinzu.)

Dies ist ein perfektes Beispiel für etwas, das in Ihrem model nicht in Ihrer Vorlage enthalten sein sollte.

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

Dann machen Sie in Ihrer Vorlage einfach:

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

Viel klarer und einfacher zu handhaben.

61
Chris Pratt

Funktionalität ist bereits mit linkebreaksbr vorhanden:

{{ value|linebreaksbr }}

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

12
peterp

Hm, ich habe dieses Problem teilweise gelöst. Ich habe meinen Filter geändert in:

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

Warum funktionierte es nicht mit dem Originalcode?

4
arts777

Ich wollte eine Wortliste aufteilen, um eine Wortzählung zu erhalten, und es stellt sich heraus, dass dafür ein Filter vorhanden ist:

{{ value|wordcount }}

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

1
ryanjdillon

Abgesehen davon, ob Ihre ursprüngliche Lösung der richtige Ansatz war, funktionierte der ursprüngliche Code wahrscheinlich nicht, da die Bedeutung von \n in Python-Code nicht dieselbe ist wie in HTML: In Python-Code bedeutet dies das in Zeilenumgebungen verwendete Zeilenvorschubzeichen in HTML Es handelt sich lediglich um die beiden getrennten Zeichen \ und n. Die Übergabe des HTML-Templates an den Python-Code als Eingabeparameter \n entspricht der Aufteilung der Python-Zeichenfolge \\n: ein Literal \, gefolgt von einer n.

0