2012-06-21 3 views
41

값이 None 인 경우 Jinja2가 "None"을 인쇄하지 않도록 설득하려면 어떻게합니까?Jinja2에서 "None"출력을 문자열로 표시하지 않습니다.

나는 사전에 많은 수의 항목이 있으며, 다른 키워드에 대한 특별한 경우 대신에 모든 것을 단일 루프로 출력하고 싶습니다. None (문자열이 아닌 NoneType) 값을 가진 경우 문자열 "None"이 템플릿 렌더링 결과에 삽입됩니다.

{{ value or '' }}을 사용하여 억제하려고하면 숫자 값도 대체되므로 잘 작동합니다.

렌더링을 위해 Jinja2에 전달하기 전에 사전을 필터링해야합니까?

+1

템플릿을 방해하지 않고이를 수행 할 수있는 방법이 있습니까? – lajarre

답변

37

{{ value if value is not None }} 위대한 작품.

이 다른 한는 다른 사용해보십시오을 가지고 있지 대한 오류가 발생하는 경우 ..

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

+1

'UndefinedError : 인라인 if식이 false로 평가되고 else 섹션이 정의되지 않았습니다. ' –

+4

'{{value if value! = None else' '}}'이 문제를 피하기 위해 필요할 수 있습니다. @GeenHenk가 있었음 – robo

+2

'! = None' 대신'None is not'이 사용되어야한다고 생각합니다. – warvariuc

20

Default filter :

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

이것은 OP의 주요 솔루션과 같은 문제가 있습니다 ... 나는 이것이 {{value | default ("", ** True **)}} –

+0

처럼 작동하지 않을 것이라고 생각합니다. True가 아니면 전혀 작동하지 않습니다. True를 사용하면 None과 숫자 0을 바꿉니다. – Spaceghost

+0

맞습니다. 변수가 정의되지 않은 경우 변수에 None을 지정하는 대신에만 작동합니다. 그러나 아무도없는 경우에 대한 필터를 작성하는 것은 선택된 대답보다 덜 장황하기 때문에 가치가 있습니다. – solarc

24

또 다른 옵션은 환경에 finalize 후크를 사용하는 것입니다 :

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

그러나 :

>>> 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

사용자 정의 필터로 문제를 해결할 수 있습니다. 이런 식으로 선언 :

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

는 다음과 같이 설치한다 :

{{value|sn}} 
+2

아마도 가장 우아한 해결책입니다. Jinja는 "sn"보다 덜 비밀스러운 이름으로 어쩌면 이런 필터를 가질 수 있습니다 :) –

+2

좋은 답변입니다. 한 가지 단점 :'val이 None이 아니라면'더 읽기 쉬울 것입니다. – MarredCheese

17

Pocco 메일 링리스트에서 해당 게시물에 따르면 : https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J

templating_environment.filters['sn'] = filter_supress_none 

이처럼 사용

Armin Ronacher (Jinja2/Flask 등의 제작자)는 다음과 같은 "파이썬" 조각은 :

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

개념은 여기에 다시 한 번 그되고, 명시 적으로 암시하는 것이 바람직하다.

편집 : 선택한 답변이 틀림 없습니다. 템플릿 변수가 문자열이거나 숫자가 0 인 상황을 실제로 알지 못했기 때문에 위의 코드 단편은 템플릿의 코드 노이즈를 줄이는 데 도움이 될 수 있습니다.

+0

질문에서 이것이 0도 표시되지 않기 때문에 도움이되지 않는다는 사실에 주목했습니다. – Spaceghost

관련 문제