2011-11-29 18 views
26

Mam pole modelu, które przechowuje listę adresów URL (tak, wiem, to jest niewłaściwy sposób) jako url1\nurl2\nurl3<...>. Muszę podzielić pole na tablicę w moim szablonu, więc stworzyłem własny filtr:Szablony Django - podzielony ciąg na tablicę

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

używam go w ten sposób:

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

ale jak widzę, nie podzielonego chcę pracować: Otrzymuję dane wyjściowe takie jak url1 url2 url3 (z liniowymi rozbiciami, jeśli spojrzę na źródło). Czemu?

Odpowiedz

52

Django celowo pomija wiele rodzajów templatetags zniechęcić cię od robienia zbyt dużo przetwarzania w szablonie. (Niestety, ludzie zwykle dodają tylko te szablony.)

To jest doskonały przykład czegoś, co powinno być w twoim modelu nie szablonem.

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

Następnie w szablonie, wystarczy zrobić:

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

Znacznie bardziej jasne i dużo łatwiej pracować.

+0

Ma to więcej sensu. Uratowałeś mnie przed wieloma błędami. –

+3

Pamiętaj jednak, że nadmiernie grube modele mogą stać się kupą nieosiągalnych rzeczy. Ten konkretny przypadek jest prawidłowy - konwertowałbyś niektóre ze swoich zserializowanych danych do Pythona, co ma sens w przypadku warstwy modelu. (Możesz nawet uczynić z tej metody wyliczoną właściwość.) Jeśli jednak chcesz umieścić metodę na swoim modelu * po prostu *, aby móc wywołać ją z szablonu, zastanów się dwa razy - może to byłoby w porządku, aby zrobić ten rodzaj przetwarzania w widoku (ach) :) – Tony

+0

lepsze niż tagi szablonów, jeśli zawartość pochodzi z modeli. Model – WeizhongTu

3

Hm, częściowo rozwiązałem ten problem. Zmieniłem filtr na:

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

Dlaczego to nie działa z oryginalnym kodem?

+0

Może trzeba było uciec \ n? – jooks

+0

Ale gdzie dokładnie umieścisz ten fragment kodu? views.py? –