Latest web development tutorials

แม่แบบ 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/ อยู่ออกผลมีดังนี้