2012-06-21 13 views
41

Jak przekonać Jinja2, aby nie drukować "None", gdy wartość to None?Ukryj "Brak" jako ciąg znaków w Jinja2

Mam kilka pozycji w słowniku i chciałbym wydrukować wszystko w pojedynczej pętli zamiast specjalnych przypadków dla różnych słów kluczowych. Jeśli mam wartość None (NoneType, a nie ciąg), to ciąg "None" jest wstawiany do wyników renderowania szablonu.

Próba tłumienia go za pomocą {{ value or '' }} działa zbyt dobrze, ponieważ zastąpi również wartość liczbową zero.

Czy muszę filtrować słownik przed przekazaniem go do wersji Jinja2 w celu renderowania?

+1

Czy można to zrobić bez ingerencji w szablon? – lajarre

Odpowiedz

37

{{ value if value is not None }} działa świetnie.

jeśli to zgłasza błąd o nie mającą jeszcze spróbuj użyć innego ..

{{ value if value is not None else '' }}

+1

Otrzymałem komunikat o błędzie: 'UndefinedError: zdefiniowano wyrażenie wstawiane if do wartości false i nie określono żadnej innej sekcji." –

+4

'{{wartość, jeśli wartość! = Brak" "}}} może być konieczne, aby uniknąć problemu @GeenHenk miał – robo

+2

Myślę, że 'nie jest żadnym' zamiast '! = None' powinien być użyty. – warvariuc

20

Default filter:

{{ value|default("", True) }} 
+1

ma ten sam problem co główne rozwiązanie OP ... Myślę, że działałoby to jako {{wartość | default ("", ** True **)}} –

+0

Bez True, to w ogóle nie działa. Z wartością True zastępuje None i numeryczne zero, więc nie jest to dobre. – Spaceghost

+0

Masz rację, działa tylko wtedy, gdy zmienna nie jest zdefiniowana, zamiast przypisywać Brak do niej. Ale pisanie filtru dla przypadku None byłoby warte tego, by być mniej szczegółowym niż wybrana odpowiedź. – solarc

24

Inną opcją jest użycie hak finalize na środowisko:

>>> import jinja2 
>>> e = jinja2.Environment() 
>>> e.from_string("{{ this }}/{{ that }}").render(this=0, that=None) 
u'0/None' 

ale:

>>> def my_finalize(thing): 
...  return thing if thing is not None else '' 
... 
>>> e = jinja2.Environment(finalize=my_finalize) 
>>> e.from_string("{{ this }}/{{ that }}").render(this=0, that=None) 
u'0/' 
14

Niestandardowy filtr może rozwiązać problem. Oświadczam, to tak:

def filter_supress_none(val): 
    if not val is None: 
     return val 
    else: 
     return '' 

Zainstaluj go tak:

templating_environment.filters['sn'] = filter_supress_none 

Używaj go tak:

{{value|sn}} 
+2

Prawdopodobnie najbardziej eleganckie rozwiązanie tutaj. Jinja może mieć taki filtr, może z mniej tajemniczą nazwą niż "sn" :) –

+2

Świetna odpowiedź. Jedna nitpick: 'if val is not None' będzie bardziej czytelna. – MarredCheese

17

Według tego postu z Pocco listy mailingowej: https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J

Armin Ronacher (twórca Jinja2/Flask, etc ...) zaleca następujące "pythonic" Fragment:

{{ variable or 0 }}{{ variable or '' }}

Pojęcie tutaj jest, że po raz kolejny, wyraźny korzystne jest niejawna.

Edytuj: Wybrana odpowiedź jest zdecydowanie poprawna. Tak naprawdę nie natknąłem się na sytuację, w której zmienna szablonu byłaby ciągiem lub cyfrą zero, więc powyższe fragmenty mogą pomóc zredukować szum kodu w szablonie.

+0

Zauważono w pytaniu, że to nie pomaga, ponieważ tłumi także numeryczne zero – Spaceghost

Powiązane problemy