Django - ระบบเทมเพลต

Django ช่วยให้สามารถแยก python และ HTML ได้โดย python จะไปในมุมมองและ HTML จะอยู่ในเทมเพลต ในการเชื่อมโยงทั้งสองอย่าง Django อาศัยฟังก์ชันการแสดงผลและภาษาเทมเพลต Django

ฟังก์ชัน Render

ฟังก์ชันนี้รับสามพารามิเตอร์ -

  • Request - คำขอเริ่มต้น

  • The path to the template - นี่คือเส้นทางที่สัมพันธ์กับตัวเลือก TEMPLATE_DIRS ในตัวแปรโปรเจ็กต์ settings.py

  • Dictionary of parameters- พจนานุกรมที่มีตัวแปรทั้งหมดที่จำเป็นในเทมเพลต คุณสามารถสร้างตัวแปรนี้หรือคุณสามารถใช้ local () เพื่อส่งผ่านตัวแปรท้องถิ่นทั้งหมดที่ประกาศในมุมมอง

ภาษาเทมเพลต Django (DTL)

เอ็นจิ้นเทมเพลตของ Django นำเสนอมินิภาษาเพื่อกำหนดเลเยอร์ที่ผู้ใช้หันหน้าเข้าหาแอปพลิเคชัน

การแสดงตัวแปร

ตัวแปรมีลักษณะดังนี้: {{variable}} เทมเพลตแทนที่ตัวแปรโดยตัวแปรที่ส่งโดยมุมมองในพารามิเตอร์ที่สามของฟังก์ชันการแสดงผล มาเปลี่ยน hello.html ของเราเพื่อแสดงวันที่ของวันนี้ -

hello.html

<html>
   
   <body>
      Hello World!!!<p>Today is {{today}}</p>
   </body>
   
</html>

จากนั้นมุมมองของเราจะเปลี่ยนเป็น -

def hello(request):
   today = datetime.datetime.now().date()
   return render(request, "hello.html", {"today" : today})

ตอนนี้เราจะได้รับผลลัพธ์ต่อไปนี้หลังจากเข้าถึง URL / myapp / hello -

Hello World!!!
Today is Sept. 11, 2015

อย่างที่คุณสังเกตเห็นแล้วถ้าตัวแปรไม่ใช่สตริง Django จะใช้เมธอด __str__ เพื่อแสดง และด้วยหลักการเดียวกันนี้คุณสามารถเข้าถึงแอตทริบิวต์วัตถุได้เช่นเดียวกับที่คุณทำใน Python ตัวอย่างเช่นหากเราต้องการแสดงปีวันที่ตัวแปรของฉันจะเป็น: {{today.year}}

ฟิลเตอร์

ช่วยให้คุณแก้ไขตัวแปรในเวลาแสดงผล โครงสร้างตัวกรองมีลักษณะดังต่อไปนี้: {{var | filters}}

Some examples -

  • {{string|truncatewords:80}} - ตัวกรองนี้จะตัดสตริงดังนั้นคุณจะเห็นเฉพาะ 80 คำแรกเท่านั้น

  • {{string|lower}} - แปลงสตริงเป็นตัวพิมพ์เล็ก

  • {{string|escape|linebreaks}} - หลีกเลี่ยงเนื้อหาสตริงจากนั้นแปลงตัวแบ่งบรรทัดเป็นแท็ก

คุณยังสามารถตั้งค่าเริ่มต้นสำหรับตัวแปร

แท็ก

แท็กช่วยให้คุณสามารถดำเนินการต่อไปนี้: if condition, for loop, template inheritance และอื่น ๆ

แท็ก if

เช่นเดียวกับใน Python คุณสามารถใช้ if, else และ elif ในเทมเพลตของคุณ -

<html>
   <body>
   
      Hello World!!!<p>Today is {{today}}</p>
      We are
      {% if today.day == 1 %}
      
      the first day of month.
      {% elif today.day == 30 %}
      
      the last day of month.
      {% else %}
      
      I don't know.
      {%endif%}
      
   </body>
</html>

ในเทมเพลตใหม่นี้ขึ้นอยู่กับวันที่ของวันนั้นเทมเพลตจะแสดงค่าที่แน่นอน

แท็กสำหรับ

เช่นเดียวกับ 'if' เรามีแท็ก 'for' ซึ่งทำงานได้เหมือนกับใน Python มาเปลี่ยนมุมมองสวัสดีเพื่อส่งรายการไปยังเทมเพลตของเรา -

def hello(request):
   today = datetime.datetime.now().date()
   
   daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
   return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})

เทมเพลตที่จะแสดงรายการโดยใช้ {{for}} -

<html>
   <body>
      
      Hello World!!!<p>Today is {{today}}</p>
      We are
      {% if today.day == 1 %}
      
      the first day of month.
      {% elif today.day == 30 %}
      
      the last day of month.
      {% else %}
      
      I don't know.
      {%endif%}
      
      <p>
         {% for day in days_of_week %}
         {{day}}
      </p>
		
      {% endfor %}
      
   </body>
</html>

และเราควรจะได้รับสิ่งที่ชอบ -

Hello World!!!
Today is Sept. 11, 2015
We are I don't know.
Mon
Tue
Wed
Thu
Fri
Sat
Sun

บล็อกและขยายแท็ก

ระบบเทมเพลตไม่สามารถสมบูรณ์ได้หากไม่มีการสืบทอดเทมเพลต ความหมายเมื่อคุณออกแบบเทมเพลตคุณควรมีเทมเพลตหลักที่มีรูที่เทมเพลตของเด็กจะเติมตามความต้องการของเขาเองเช่นเพจอาจต้องใช้ css พิเศษสำหรับแท็บที่เลือก

มาเปลี่ยนเทมเพลต hello.html เพื่อสืบทอดจาก main_template.html

main_template.html

<html>
   <head>
      
      <title>
         {% block title %}Page Title{% endblock %}
      </title>
      
   </head>
	
   <body>
   
      {% block content %}
         Body content
      {% endblock %}
      
   </body>
</html>

hello.html

{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}

Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}

the first day of month.
{% elif today.day == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

<p>
   {% for day in days_of_week %}
   {{day}}
</p>

{% endfor %}
{% endblock %}

ในตัวอย่างข้างต้นในการโทร / myapp / hello เราจะยังคงได้ผลลัพธ์เหมือนเดิม แต่ตอนนี้เราอาศัยการขยายและบล็อกเพื่อ refactor รหัสของเรา -

ใน main_template.html เรากำหนดบล็อกโดยใช้แท็กบล็อก บล็อกหัวเรื่องจะมีชื่อเพจและบล็อกเนื้อหาจะมีเนื้อหาหลักของเพจ ใน home.html เราใช้การขยายเพื่อสืบทอดจาก main_template.html จากนั้นเราเติมคำจำกัดความของบล็อกด้านบน (เนื้อหาและชื่อเรื่อง)

แท็กความคิดเห็น

แท็กความคิดเห็นช่วยในการกำหนดความคิดเห็นเป็นเทมเพลตไม่ใช่ความคิดเห็น HTML แต่จะไม่ปรากฏในหน้า HTML อาจเป็นประโยชน์สำหรับการจัดทำเอกสารหรือเพียงแค่แสดงความคิดเห็นเกี่ยวกับโค้ด