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
(ソースを見ると改行付き)。どうして?
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 %}
はるかに明確で、作業がはるかに簡単です。
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コードでは、エスケープされた改行文字を意味します。別の文字\
およびn
。したがって、入力パラメーターとして渡す\n
HTMLテンプレートからPythonコードへのコードは、Python string \\n
:リテラル\
の後にn
が続きます。