오브젝트가 기본값을 설정하지 않은 경우 Jinja2 템플리트 변수


146

jijna2에서 변수를 만드는 방법 대신 객체가 None 인 경우 기본적으로 ""로 설정하는 방법은 무엇입니까?

      {% if p %}   
        {{ p.User['first_name']}}
      {% else %}
        NONE
      {%endif %}

따라서 객체 p가 None이면 p (first_name 및 last_name)의 값을 ""로 기본값으로 설정하고 싶습니다. 원래

nvl(p.User[first_name'], "")

수신 오류 :

Error:  jinja2.exceptions.UndefinedError
    UndefinedError: 'None' has no attribute 'User'

1
pnever return 값을 반환 한 함수를 만듭니다 None. None함수 대신 실제 객체와 구조가 동일한 프록시 객체를 반환해야하지만 원하는 기본값으로로드됩니다.
Miguel

나는 이것을 사용하고 내 문제는 해결 : {% if p! = None %} {{p.User [ 'first_name']}} {% endif %}
Mona Mohamadinia

답변:


242

none내장 함수를 사용하십시오 ( http://jinja.pocoo.org/docs/templates/#none ).

{% if p is not none %}   
    {{ p.User['first_name'] }}
{% else %}
    NONE
{%endif %}

또는

{{ p.User['first_name'] if p != None else 'NONE' }}

또는 빈 문자열이 필요한 경우 :

{{ p.User['first_name'] if p != None }}

19
none답변 에서 소문자 를 확인하십시오. None의 경우를 수정 한 후 문제가 해결되었습니다.
harperville 2016 년


70

문서 에 따르면 다음과 같이 할 수 있습니다.

{{ p|default('', true) }}

원인 None에 캐스트 False부울 맥락에서.


업데이트 : lindes가 언급했듯이 간단한 데이터 유형에만 작동합니다.


5
이것은 간단한 변수에는 효과가 있지만 더 복잡한 변수에서 필드를 가져 오려는이 질문에는 해당되지 않습니다. 나는 원래 질문에 대한 좋은 대답이 아니기 때문에 이것을 다운 default투표 할 것입니다. 그러나 동시에, 나는 특정 사건에 필요한 것이 무엇인지 알기 때문에 투표하지 않습니다. (이 답변에 대한 수정 default이이 상황 에 적용 하기 어렵다고 생각하는 것을 제외하고는이 답변에 대한 수정
안으로 공평한 수익을 올릴 수

31

다른 답변 외에도 variable이 None 인 경우 다른 것을 작성할 수 있습니다.

{{ variable or '' }}

3
나는이 단순함에 놀랐다! 파이썬은 x or y입니다 if x is false, then y, else x. 5.2
kenjiuno

10

이 문서따르면 다음과 같이 할 수 있습니다.

{{ p.User['first_name']|default('NONE') }}

8
나는 그렇게 생각하지 않습니다-값이 정의되지 않았거나 누락되면 "기본"템플릿 필터가 기본값을 반환합니다.
codeape

ansible을 사용할 때 나를 위해 일했습니다. 더 명확 해졌습니다 : stackoverflow.com/q/28885184/1005215
Nehal J Wani

1
p가 정의 된 경우. 그러나 P는 정의되어 있지 않은 경우 작동하지 않음
dalore

5

"p"또는 "p.User"가 None 인 동안 예외가 발생하지 않도록하려면 다음을 사용할 수 있습니다.

{{ (p and p.User and p.User['first_name']) or "default_value" }}

4
이것은 내 변수가 dict에 깊이 묻혀있어 나를 위해 일한 유일한 것입니다.
Craicerjack

이것은 많은 논리로 다른 사람들을 정리하는 데 도움이됩니다.
eagle33322

1

다른 솔루션으로 (이전 솔루션과 유사한 종류) :

{{ ( p is defined and p.User is defined and p.User['first_name'] ) |default("NONE", True) }}

마지막 변수 (p.User [ 'first_name'])는 그 if defined이후 에 테스트를 하지 않습니다 .


0

나는 일반적으로 정의하는 nvl기능을하고,에 넣어 globalsfilters.

def nvl(*args):
    for item in args:
        if item is not None:
            return item
    return None

app.jinja_env.globals['nvl'] = nvl
app.jinja_env.filters['nvl'] = nvl

템플릿에서의 사용법 :

<span>Welcome {{ nvl(person.nick, person.name, 'Anonymous') }}<span>

// or 

<span>Welcome {{ person.nick | nvl(person.name, 'Anonymous') }}<span>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.