จากบล็อกที่แล้ว เราได้คุยกันพอหอมปากหอมคอถึงวิธีไหนบ้างที่เราจะเขียน template string ได้

คราวนี้ มาใช้ Jinja2 กันแบบจริงจังกันบ้างฮะ


ของที่ต้องมีก่อน

แน่นอนฮะ เราต้อง install jinja 2 library ก่อนแหละ ถึงจะใช้งานมันได้

Jinja — Jinja Documentation (3.1.x)

ทีนี้เราก็เริ่มลงมือกันได้ฮะ


1. ตัวแปรใน string

เราสามารถใส่ตัวแปรลงไปใน Jinja2 template ง่ายๆ แค่นี้เลยฮะ

Jinja2 template

  • {{<variable>}} เพื่อใส่ค่า variable
  • {{<dict>.<field>}} เพื่อใส่ค่า key ใน dict ที่กำหนด
  • {# <comment> #} สำหรับ comment ซึ่งจะไม่แสดงผลออกมาฮะ
  • '{{ }}' เพื่อแสดงอักขระ quote

Python script

ใช้ Jinja2.Template(template).render(data) เพื่อ render string ที่เติมตัวแปรนั่นนี่ไปแล้วฮะ

Output


2. ใช้ if-else clauses

Jinja2 support if-else condition ได้นะ

Jinja2 template

  • {% if <statement> %} เริ่ม if-else
  • {% elif <statement> %} ให้เป็น else-if
  • {% else %} เป็น else
  • {% endif %} จบ if-else

Python script

สร้างข้อมูลของ Alizabeth แล้วมาดูผลกัน

Output

ดูเหมือนผลลัพท์จะแปลกๆ นะ มีเว้นวรรค ขึ้นบรรทัดใหม่แบบไม่ถูกเท่าไหร่

Jinja2 template (fixed)

  • แทนที่จะใช้ {% ... %} เฉยๆ เราจะเติม dash เป็นแบบนี้ {%- ... %} ซึ่งหมายถึง เราไม่เอา space ที่อยู่ทางซ้ายมือนะ

Output (fixed)

แสดงข้อความถูกต้องแล้วล่ะ


3. เติม loop

Jinja2 support iteration ด้วยแหละ

Jinja2 template

  • {% for <element> in <iterator> %} เริ่ม iteration.
  • {{ <element> }} หรือ ถ้าเป็น dict ก็ใช้ {{ <element>.<key>}}
  • {{ ... -}} พร้อม dash ทางขวา เพื่อลบ space ทางขวามือ
  • {% else %} ถ้า iterator ไม่มีตัวแปรข้างในเลย มันจะมาตก case นี้ฮะ
  • {% endfor %} จบ iteration

Python script

Output

ถ้าเรามีคนที่ไม่มีข้อมูล pets จะได้แบบนี้

ส่วนถ้ามี pets จะเป็นแบบนี้


4. เรียก file อื่นมาด้วย

เราสามารถอ้างอิง file Jinja2 template อื่นแล้วมารวมใน file เดียวกันได้นะ

Jinja2 template

  • {% include '<filepath>' %} อ้างอิง file ที่เราต้องการ

Python script

ตรงนี้ เราจะใช้ Jinja2.Environment(loader=Jinja2.FileSystemLoader("<folder_path>")).from_string(template).render(data)

ไม่อย่างนั้น จะเจอ error TypeError: no loader for this environment specified

Output


References