แม่แบบ Django
ในบทที่ผ่านมาเราใช้ django.http.HttpResponse () เพื่อการส่งออก "Hello World!" วิธีที่ข้อมูลจะถูกผสมเข้าด้วยกันมีมุมมองที่ไม่ตรงกับความคิดของ Django MVC
บทนี้เราจะอธิบายให้คุณ Django ประยุกต์ใช้แม่แบบแม่แบบเป็นข้อความสำหรับการนำเสนอและเอกสารแยกต่างหากเนื้อหา
ตัวอย่างการใช้งานแม่แบบ
เราตามส่วนก่อนหน้าของโครงการจะได้รับการสร้างขึ้นภายใต้ HelloWorld ไดเรกทอรีไดเรกทอรีแม่แบบและสร้างไฟล์ hello.html โครงสร้างสารบบทั้งหมดมีดังนี้
HelloWorld/ |-- HelloWorld | |-- __init__.py | |-- __init__.pyc | |-- settings.py | |-- settings.pyc | |-- urls.py | |-- urls.pyc | |-- view.py | |-- view.pyc | |-- wsgi.py | `-- wsgi.pyc |-- manage.py `-- templates `-- hello.html
รหัสไฟล์ hello.html เป็นดังนี้:
<h1>{{ hello }}</h1>
เรารู้จากตัวแปรแม่แบบในการใช้วงเล็บคู่
ต่อไปเราต้องอธิบายเส้นทาง Django แฟ้มแม่แบบปรับเปลี่ยน HelloWorld / settings.py, ปรับเปลี่ยนแม่ dirs ไปที่[BASE_DIR + "/ แม่แบบ" ] ดังนี้
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR+"/templates",], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
ตอนนี้เราปรับเปลี่ยน view.py เพิ่มวัตถุใหม่สำหรับการส่งข้อมูลไปยังแม่แบบ:
# -*- coding: utf-8 -*- #from django.http import HttpResponse from django.shortcuts import render def hello(request): context = {} context['hello'] = 'Hello World!' return render(request, 'hello.html', context)
เราจะเห็นว่าเราใช้ที่นี่แทนทำให้ HttpResponse ก่อนการใช้งาน ทำให้ยังใช้บริบทพจนานุกรมเป็นพารามิเตอร์
องค์ประกอบที่สำคัญในพจนานุกรมบริบท "สวัสดี" สอดคล้องกับตัวแปรในแม่แบบ "สวัสดี {{}}"
จากนั้นไปเยี่ยมชม http://192.168.45.3:8000/hello/ คุณสามารถดูหน้านี้:
จากนั้นเราก็เสร็จแม่แบบในการใช้ข้อมูลการส่งออกที่ช่วยให้การแยกมุมมองข้อมูล
ต่อไปเราจะมาแนะนำกฎไวยากรณ์แม่แบบที่พบบ่อย
Django แท็กแม่แบบ
ถ้าอื่นแท็ก /
ไวยากรณ์พื้นฐานจะเป็นดังนี้:
{% if condition %} ... display {% endif %}
หรือ:
{% if condition1 %} ... display 1 {% elif condiiton2 %} ... display 2 {% else %} ... display 3 {% endif %}
ตามเงื่อนไขเพื่อตรวจสอบว่าการส่งออก หาก / อื่นสนับสนุนซ้อนกัน
{% หาก%} แท็กยอมรับหรือหรือไม่ที่จะทำให้การตัดสินเกี่ยวกับคำหลักไปหลายตัวแปรหรือตัวแปรเมื่อตะกี้ (ไม่) ตัวอย่างเช่น:
{% if athlete_list and coach_list %} athletes 和 coaches 变量都是可用的。 {% endif %}
สำหรับป้ายชื่อ
{% สำหรับ%} ช่วยให้เราสามารถย้ำกว่าลำดับ
และกรณีที่ ธ สำหรับงบที่คล้ายกันคือไวยากรณ์ห่วงสำหรับ X ใน Y, Y เป็นลำดับที่จะห่วงมากกว่าและ X เป็นชื่อตัวแปรที่ใช้ในวงจรแต่ละ
ในแต่ละครั้งที่ผ่านห่วงระบบแม่แบบจะทำให้ทุก {% สำหรับ%} เนื้อหา {% endfor%} ระหว่าง
ตัวอย่างเช่นกำหนดรายชื่อของตัวแปรนักกีฬา athlete_list เราสามารถใช้รหัสต่อไปนี้จะแสดงรายการนี้:<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
ฉลากเพิ่มรายการที่จะย้อนกลับไปเพื่อให้ iterator กลับ:
{% for athlete in athlete_list reversed %} ... {% endfor %}
คุณสามารถซ้อนกันแท็ก {% สำหรับ%}:
{% for athlete in athlete_list %} <h1>{{ athlete.name }}</h1> <ul> {% for sport in athlete.sports_played %} <li>{{ sport }}</li> {% endfor %} </ul> {% endfor %}
ifequal / ifnotequal แท็ก
{% ifequal%} แท็กเปรียบเทียบสองค่าเมื่อพวกเขามีค่าเท่ากันแสดงค่าทั้งหมดใน {% ifequal%} และ {% endifequal%} เป็น
ตัวอย่างต่อไปนี้เปรียบเทียบการใช้ตัวแปรแม่แบบและสอง CurrentUser:
{% ifequal user currentuser %} <h1>Welcome!</h1> {% endifequal %}
และถ้า {%%} ในทำนองเดียวกัน {% ifequal%} สนับสนุนตัวเลือกอื่น {%%} แท็ก: 8
{% ifequal section 'sitenews' %} <h1>Site News</h1> {% else %} <h1>No News Here</h1> {% endifequal %}
แท็บหมายเหตุ
คำอธิบายประกอบ Django ใช้ {##}
{# 这是一个注释 #}
กรอง
กรองแม่แบบที่สามารถแสดงผลในตัวแปรก่อนที่จะปรับเปลี่ยน, อักขระท่อกรองดังต่อไปนี้:
{{ name|lower }}
{{}} ชื่อตัวแปรหลังจากที่ถูกประมวลผลตัวกรองที่ต่ำกว่าเอกสารแปลงข้อความให้เป็นตัวพิมพ์เล็กพิมพ์ใหญ่
ซ็อกเก็ตท่อกรองสามารถ * * ทั้งสองบอกว่าเป็นท่อกรองออกและสามารถนำมาใช้เป็น input เพื่อท่อต่อไปนี้:
{{ my_list|first|upper }}
องค์ประกอบแรกของตัวอย่างข้างต้นและแปลงเป็นตัวพิมพ์ใหญ่
ฟิลเตอร์บางคนมีพารามิเตอร์ หลังจากพารามิเตอร์ตัวกรองตามลำไส้ใหญ่และราคาคู่เสมอ ตัวอย่างเช่น:
{{ bio|truncatewords:"30" }}
ตัวแปรนี้จะแสดง 30 คำแรกของชีวภาพ
กรองอื่น ๆ :
- addslashes: การเพิ่มเครื่องหมายทับขวาในด้านหน้าของคำพูดเดียวหรือคำพูดสอง
- วันที่: กดรูปแบบรูปแบบสตริงอาร์กิวเมนต์วันที่ระบุหรือวัตถุเช่นวันที่และเวลา:
{{ pub_date|date:"F j, Y" }}
- ความยาว: คืนความยาวของตัวแปร
รวมแท็ก
{% รวม%} แท็กช่วยให้เนื้อหาอื่น ๆ ที่มีแม่แบบในแม่แบบ
ต่อไปนี้คือตัวอย่างที่สองรวมแม่แบบ nav.html:
{% include "nav.html" %}
มรดกแม่แบบ
แม่สามารถสืบทอดวิธีการเพื่อให้บรรลุมัลติ
ต่อไปเราจะสร้างไดเรกทอรีแม่ก่อนที่จะเพิ่มแฟ้มโครงการ base.html ดังต่อไปนี้:
<html> <head> <title>Hello World!</title> </head> <body> <h1>Hello World!</h1> {% block mainbody %} <p>original</p> {% endblock %} </body> </html>
โค้ดด้านบนแท็กบล็อกชื่อ mainbody ก็คือว่ามันอาจจะเป็นผู้สืบทอดการเปลี่ยนชิ้นส่วน
ทั้งหมด {บล็อก%%} แท็กบอกเครื่องมือแม่แบบที่แม่เด็กสามารถแทนที่ชิ้นส่วนเหล่านี้
hello.html รับมรดก base.html และแทนที่บล็อกเฉพาะ hello.html รหัสแก้ไขดังนี้:
{% extends "base.html" %} {% block mainbody %} <p>继承了 base.html 文件</p> {% endblock %}
บรรทัดแรกของการแสดงให้เห็นถึงรหัส hello.html รับมรดกไฟล์ base.html เราสามารถดูที่นี่ชื่อเดียวกันของแท็กบล็อกเพื่อแทนที่บล็อกที่สอดคล้องกัน base.html
ทบทวน http://192.168.45.3:8000/hello/ อยู่ออกผลมีดังนี้