2011-11-29 35 views
26

私はというURLのリストを格納するモデルフィールドを持っています(間違った方法です)。私は私のテンプレートで配列にフィールドを分割する必要があるので、私は、カスタムフィルタを作成:Djangoテンプレート - 配列を分割する

@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のような出力を得る(私はソースを見れば改行がある)。どうして?

答えて

52

Djangoは意図的にテンプレートにあまりにも多くの処理を行うことからあなたを阻止するためにtemplatetagsの多くの種類を残します。 (残念ながら、人々は通常、これらのタイプのtemplatetagsを自分で追加します)。

のテンプレートには、これは完璧な例です。

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

次に、あなたのテンプレートで、あなただけの操作を行います。

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

はるかにはっきりとで作業する方がはるかに簡単。

+0

これははるかに理にかなっています。あなたは私を多くのことから間違って救った。 –

+3

しかし、過度に太ったモデルは、維持不能なものの山になる可能性があることに注意してください。この特殊なケースは有効です。直列化されたデータの一部をPythonに変換することになります。これはモデルレイヤで行うのが理にかなっています。 (あなたはそのメソッドを計算されたプロパティにすることさえできます)しかし、テンプレートから呼び出すことができるようにメソッドをモデルに置くには、そのようなことを2回考えてくださいあなたのビュー(s)での処理: – Tony

+0

テンプレートのコンテンツよりも優れています。モデル – WeizhongTu

3

私はこの問題を部分的に解決しました。フィルタを変更しました:

なぜ元のコードではうまくいかなかったのですか?

+0

たぶん、あなたは\ nを脱出するために必要な? – jooks

+0

しかし、このコードをどこに置いていますか? views.py? –