web-dev-qa-db-ja.com

Django templates-文字列を配列に分割

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

しかし、私が見ることができるように、分割は動作したくありません:私はurl1 url2 url3(ソースを見ると改行付き)。どうして?

39
int_32

Djangoは、多くの種類のテンプレートタグを意図的に除外して、テンプレートでの処理が過剰になるのを防ぎます。 (残念ながら、人々は通常、これらのタイプのテンプレートタグを自分で追加するだけです。)

これは、テンプレートではなくmodelにあるべきものの完璧な例です。

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

次に、テンプレートで次の操作を行います。

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

はるかに明確で、作業がはるかに簡単です。

66
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
int_32

単語数を取得するために単語のリストを分割したかったのですが、そのためのフィルターがあることがわかりました。

{{ value|wordcount }}

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

1
ryanjdillon

元のソリューションが正しいアプローチであったかどうかは別として、元のコードは、\nは、Python HTMLと同じコードではありません。Pythonコードでは、エスケープされた改行文字を意味します。別の文字\およびn。したがって、入力パラメーターとして渡す\n HTMLテンプレートからPythonコードへのコードは、Python string \\n:リテラル\の後にnが続きます。

0