2011-11-29 11 views
26

Ho un campo modello, che memorizza un elenco di URL (sì, lo so, è il modo sbagliato) come url1\nurl2\nurl3<...>. Ho bisogno di dividere il campo in un array nel mio modello, così ho creato il filtro personalizzato:Modelli Django - stringa divisa per array

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

Io lo uso in questo modo:

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

ma come posso vedere, non lo fa spaccatura voglio lavorare: ottengo output come url1 url2 url3 (con interruzioni di riga se guardo la fonte). Perché?

risposta

52

Django lascia volutamente fuori molti tipi di templatetags a scoraggiare dal fare troppo trasformazione nel modello. (Sfortunatamente, la gente di solito aggiunge solo questi tipi di modelli temporanei).

Questo è un esempio perfetto di qualcosa che dovrebbe essere nel modello non nel modello.

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

Poi, nel modello, basta fare:

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

molto più chiaro e più facile da lavorare.

+0

Questo ha molto più senso. Mi hai salvato da molte cose sbagliate. –

+3

Tenete a mente, però, che i modelli eccessivamente grassi possono diventare una pila di cose non mantenibili. Questo caso specifico è valido: convertirai alcuni dati serializzati in Python, cosa che è sensata fare sul livello del modello. (Puoi anche rendere quel metodo una proprietà calcolata.) Tuttavia, se vuoi mettere un metodo sul tuo modello * solo * in modo che tu possa chiamarlo dal tuo modello, pensaci due volte, forse sarebbe OK farlo quel tipo di elaborazione nella vista (i) :) – Tony

+0

meglio dei tag modello se il contenuto proviene dai modelli. Modello – WeizhongTu

3

Hm, ho parzialmente risolto questo problema. Ho cambiato il mio filtro in:

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

Perché non ha funzionato con il codice originale?

+0

Forse avevi bisogno di fuggire \ n? – jooks

+0

Ma dove metti esattamente questo pezzo di codice? views.py? –