Biến mẫu Jinja2 nếu Không đối tượng đặt giá trị mặc định


145

Làm thế nào để biến một biến trong jijna2 mặc định thành "" nếu đối tượng là Không thay vì làm một cái gì đó như thế này?

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

Vì vậy, nếu đối tượng p là Không tôi muốn mặc định các giá trị của p (first_name và last_name) thành "". Về cơ bản

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

Lỗi nhận:

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

1
Làm cho hàm trả về giá trị pkhông bao giờ trả về None. Thay vì Nonehàm nên trả về một đối tượng proxy có cùng cấu trúc với một đối tượng thực nhưng nó được tải với các giá trị mặc định mà bạn muốn.
Miguel

Tôi sử dụng điều này và vấn đề của tôi đã được giải quyết: {% if p! = Không%} {{p.User ['first_name']}} {% endif%}
Mona Mohamadinia 23/12/18

Câu trả lời:


241

Sử dụng nonehàm dựng sẵn ( http://jinja.pocoo.org/docs/temsheet/#none ):

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

hoặc là

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

hoặc nếu bạn cần một chuỗi rỗng:

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

19
Chú ý chữ thường nonetrong câu trả lời. Vấn đề của tôi đã được giải quyết sau khi tôi sửa trường hợp của Không.
harperville


70

Theo tài liệu bạn chỉ có thể làm:

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

Nguyên nhân Nonephôi Falsetrong bối cảnh boolean.


Cập nhật : Như lindes đã đề cập, nó chỉ hoạt động cho các loại dữ liệu đơn giản.


5
Điều này hoạt động cho một biến đơn giản, nhưng không phải cho câu hỏi này khi bạn đang tìm cách lấy một trường ra khỏi một trường phức tạp hơn. Tôi sẽ đánh giá thấp điều này, vì nó không phải là một câu trả lời hay cho câu hỏi ban đầu ... nhưng đồng thời, biết về defaultchính xác những gì tôi cần cho trường hợp cụ thể của mình, vì vậy ... đơn giản là không bỏ phiếu. (Một chỉnh sửa cho câu trả lời này có thể kiếm được một upvote, ngoại trừ việc tôi nghĩ rằng có thể khó áp dụng defaultcho tình huống này)
lindes


10

Theo tài liệu này, bạn có thể làm theo cách này:

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

8
Tôi không nghĩ vậy - bộ lọc mẫu "mặc định" trả về giá trị mặc định nếu giá trị không xác định / bị thiếu.
codeape

Làm việc cho tôi khi sử dụng ansible. Điều này làm cho nó rõ ràng hơn: stackoverflow.com/q/28885184/1005215
Nehal J Wani

1
Nếu p được xác định. Nhưng nếu P không được xác định thì nó không hoạt động
12:30

5

Để tránh ném ngoại lệ trong khi "p" hoặc "p.User" là Không có, bạn có thể sử dụng:

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

4
Đây là người duy nhất làm việc cho tôi khi biến của tôi bị chôn sâu trong một câu lệnh.
Craicerjack

Điều này giúp làm sạch một số người khác với rất nhiều logic.
đại bàng33322

1

Là một giải pháp khác (loại tương tự như một số giải pháp trước):

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

Lưu ý biến cuối cùng (p.User ['first_name']) không có if definedkiểm tra sau nó.


0

Tôi thường định nghĩa một nvlhàm, và đặt nó vào 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

Cách sử dụng trong một mẫu:

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

// or 

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.