Django - Hệ thống mẫu

Django làm cho nó có thể tách biệt python và HTML, python đi trong các chế độ xem và HTML đi trong các mẫu. Để liên kết cả hai, Django dựa vào chức năng kết xuất và ngôn ngữ Mẫu Django.

Chức năng kết xuất

Hàm này nhận ba tham số:

  • Request - Yêu cầu ban đầu.

  • The path to the template - Đây là đường dẫn liên quan đến tùy chọn TEMPLATE_DIRS trong các biến cài đặt của dự án.

  • Dictionary of parameters- Một từ điển chứa tất cả các biến cần thiết trong mẫu. Biến này có thể được tạo hoặc bạn có thể sử dụng local () để chuyển tất cả các biến cục bộ được khai báo trong khung nhìn.

Ngôn ngữ mẫu Django (DTL)

Công cụ mẫu của Django cung cấp một ngôn ngữ nhỏ để xác định lớp giao diện người dùng của ứng dụng.

Hiển thị các biến

Một biến có dạng như sau: {{variable}}. Mẫu thay thế biến bằng biến được gửi bởi khung nhìn trong tham số thứ ba của hàm kết xuất. Hãy thay đổi hello.html của chúng tôi để hiển thị ngày hôm nay -

hello.html

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

Sau đó, chế độ xem của chúng tôi sẽ thay đổi thành -

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

Bây giờ chúng ta sẽ nhận được kết quả sau sau khi truy cập URL / myapp / hello -

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

Như bạn có thể đã nhận thấy, nếu biến không phải là một chuỗi, Django sẽ sử dụng phương thức __str__ để hiển thị nó; và với nguyên tắc tương tự, bạn có thể truy cập một thuộc tính đối tượng giống như bạn làm điều đó trong Python. Ví dụ: nếu chúng tôi muốn hiển thị ngày tháng, biến của tôi sẽ là: {{today.year}}.

Bộ lọc

Chúng giúp bạn sửa đổi các biến tại thời điểm hiển thị. Cấu trúc bộ lọc trông giống như sau: {{var | filter}}.

Some examples -

  • {{string|truncatewords:80}} - Bộ lọc này sẽ cắt bớt chuỗi, vì vậy bạn sẽ chỉ thấy 80 từ đầu tiên.

  • {{string|lower}} - Chuyển chuỗi thành chữ thường.

  • {{string|escape|linebreaks}} - Thoát khỏi nội dung chuỗi, sau đó chuyển đổi ngắt dòng thành thẻ.

Bạn cũng có thể đặt mặc định cho một biến.

Thẻ

Thẻ cho phép bạn thực hiện các thao tác sau: điều kiện if, vòng lặp for, kế thừa mẫu và hơn thế nữa.

Gắn thẻ nếu

Cũng giống như trong Python, bạn có thể sử dụng if, else và elif trong mẫu của mình -

<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>

Trong mẫu mới này, tùy thuộc vào ngày trong ngày, mẫu sẽ hiển thị một giá trị nhất định.

Gắn thẻ cho

Cũng giống như 'if', chúng ta có thẻ 'for', hoạt động giống như trong Python. Hãy thay đổi chế độ xem hello của chúng tôi để truyền một danh sách đến mẫu của chúng tôi -

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})

Mẫu để hiển thị danh sách đó bằng cách sử dụng {{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>

Và chúng ta sẽ nhận được một cái gì đó như -

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

Chặn và mở rộng thẻ

Hệ thống mẫu không thể hoàn chỉnh nếu không có kế thừa mẫu. Có nghĩa là khi bạn đang thiết kế các mẫu của mình, bạn nên có một mẫu chính với các lỗ mà mẫu của trẻ sẽ lấp đầy theo nhu cầu của riêng mình, giống như một trang có thể cần một css đặc biệt cho tab đã chọn.

Hãy thay đổi mẫu hello.html để kế thừa từ 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 %}

Trong ví dụ trên, khi gọi / myapp / hello, chúng ta vẫn sẽ nhận được kết quả tương tự như trước đây nhưng bây giờ chúng ta dựa vào extension và block để cấu trúc lại mã của chúng ta -

Trong main_template.html, chúng tôi xác định các khối bằng cách sử dụng khối thẻ. Khối tiêu đề sẽ chứa tiêu đề trang và khối nội dung sẽ có nội dung chính của trang. Trong home.html, chúng tôi sử dụng extension để kế thừa từ main_template.html, sau đó chúng tôi điền vào khối được xác định ở trên (nội dung và tiêu đề).

Thẻ nhận xét

Thẻ nhận xét giúp xác định nhận xét thành các mẫu, không phải nhận xét HTML, chúng sẽ không xuất hiện trong trang HTML. Nó có thể hữu ích cho tài liệu hoặc chỉ bình luận một dòng mã.