Jak ustawić zmienną w jijna2 jako domyślną, jeśli obiekt ma wartość None zamiast robić coś takiego?
{% if p %}
{{ p.User['first_name']}}
{% else %}
NONE
{%endif %}
Więc jeśli obiekt p ma wartość None, chcę ustawić domyślne wartości p (first_name i last_name) na „”. Gruntownie
nvl(p.User[first_name'], "")
Błąd podczas odbierania:
Error: jinja2.exceptions.UndefinedError
UndefinedError: 'None' has no attribute 'User'
p
nigdy nie zwracaNone
. ZamiastNone
funkcji powinna zwrócić obiekt proxy, który ma taką samą strukturę jak rzeczywisty obiekt, ale jest ładowany z domyślnymi wartościami, które chcesz.Odpowiedzi:
Skorzystaj z
none
wbudowanej funkcji ( http://jinja.pocoo.org/docs/templates/#none ):lub
lub jeśli potrzebujesz pustego ciągu:
źródło
none
w odpowiedzi. Mój problem został rozwiązany po tym, jak poprawiłem przypadek Żaden.źródło
Według dokumentów możesz po prostu zrobić:
Powoduj
None
rzutowanie naFalse
w kontekście logicznym.Aktualizacja : Jak wspomniałem Lindes, działa tylko dla prostych typów danych.
źródło
default
jest dokładnie tym, czego potrzebowałem w moim konkretnym przypadku, więc ... po prostu nie głosuję. (Zmiana tej odpowiedzi może przynieść jej pozytywną opinię, z wyjątkiem tego, że myślę, że prawdopodobnie trudno ją zastosowaćdefault
w tej sytuacji)Oprócz innych odpowiedzi można napisać coś innego, jeśli zmienna ma wartość None w ten sposób:
źródło
x or y
jestif x is false, then y, else x
. Patrz: 5.2. Operacje boolowskie - i lub nieKorzystając z tego dokumentu, możesz to zrobić w następujący sposób:
źródło
Aby uniknąć zgłaszania wyjątku, gdy „p” lub „p.User” ma wartość None, możesz użyć:
źródło
Jako inne rozwiązanie (trochę podobne do niektórych poprzednich):
Zauważ, że ostatnia zmienna (p.User ['first_name']) nie ma po sobie
if defined
testu.źródło
Zwykle definiuję
nvl
funkcję i umieszczam ją wglobals
ifilters
.Wykorzystanie w szablonie:
źródło
Od Ansible 2.8 możesz po prostu użyć:
Zobacz https://docs.ansible.com/ansible/latest/porting_guides/porting_guide_2.8.html#jinja-undefined-values
źródło