ตัวแปรเท็มเพลต Jinja2 หากไม่มีวัตถุตั้งค่าเริ่มต้น


146

วิธีการทำให้ตัวแปรใน jijna2 เป็นค่าเริ่มต้นเป็น "" ถ้าวัตถุไม่มีแทนการทำอะไรเช่นนี้?

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

ดังนั้นถ้า object p เป็น None ฉันต้องการเริ่มต้นค่า p (ชื่อและนามสกุล) เป็น "" เป็นพื้น

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

รับข้อผิดพลาด:

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

1
ทำให้ฟังก์ชั่นที่ส่งกลับค่าของไม่เคยกลับมาp Noneแทนที่จะNoneใช้ฟังก์ชันควรส่งคืนพร็อกซีอ็อบเจ็กต์ที่มีโครงสร้างเดียวกันกับวัตถุจริง แต่โหลดด้วยค่าเริ่มต้นที่คุณต้องการ
Miguel

ฉันใช้สิ่งนี้และปัญหาของฉันได้รับการแก้ไขแล้ว: {% if p! = ไม่มี%}} {{p.User ['first_name']}} {% endif%}
Mona Mohamadinia

คำตอบ:


243

ใช้noneฟังก์ชั่น builtin ( 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ในคำตอบ ปัญหาของฉันได้รับการแก้ไขหลังจากฉันแก้ไขกรณีของไม่มี
harperville


70

ตามเอกสารที่คุณสามารถทำได้:

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

สาเหตุมีการNoneปลดออกFalseในบริบทบูลีน


อัปเดต : ตามที่กล่าวถึง lindes ทำงานได้กับประเภทข้อมูลอย่างง่ายเท่านั้น


5
มันใช้งานได้กับตัวแปรง่ายๆ แต่ไม่ใช่สำหรับคำถามนี้ที่คุณต้องการดึงฟิลด์ออกมาจากฟิลด์ที่ซับซ้อนกว่า ฉันจะลงคะแนนเพราะนี่ไม่ใช่คำตอบที่ดีสำหรับคำถามต้นฉบับ ... และในเวลาเดียวกันการรู้เกี่ยวกับdefaultสิ่งที่ฉันต้องการสำหรับกรณีเฉพาะของฉันดังนั้น ... เพียงแค่ไม่ลงคะแนน (แก้ไขคำตอบนี้ดีอาจได้รับมัน upvote ยกเว้นว่าฉันคิดว่ามันเป็นไปได้ยากที่จะนำไปใช้defaultกับสถานการณ์นี้)
Lindes

31

นอกเหนือจากคำตอบอื่น ๆ แล้วเราสามารถเขียนอย่างอื่นได้ถ้าตัวแปรไม่มีเช่นนี้:

{{ 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
นี่เป็นสิ่งเดียวที่ใช้ได้ผลสำหรับฉันเพราะตัวแปรของฉันถูกฝังลึกในคำสั่ง
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.