2010-02-24 34 views
12

Bạn tôi và tôi đang tranh luận nhỏ. Trong dự án Django hiện tại của tôi, tôi đã tạo ra một tệp gọi là menu.html sẽ chứa một loạt các liên kết được cấu hình và định dạng thành một danh sách. Thay vì bằng tay cứng mã hóa menu vào mỗi trang, Tôi hiện đang bao gồm cả menu sử dụng mã Django/Python sau:Django: Mở rộng hoặc bao gồm?

{% include 'menu.html' %} 

Tuy nhiên, bạn bè của tôi được gợi ý rằng đây là cách không chính xác để làm điều đó. Anh ấy nói tôi cần sử dụng mở rộng thay vì bao gồm và sau đó xác định nội dung, như sau:

{% extend 'menu.html' %} 
{% block content %} 
The rest of my content here. 
{% endblock %} 

Đó là một chút mã bổ sung. Liệu nó thực sự quan trọng mà tôi sử dụng? Tôi thích sử dụng cái cũ hơn.

Trả lời

12

Vâng, nó quan trọng. Đầu tiên của tất cả các extends chỉ có thể xảy ra như là dòng đầu tiên của tập tin. Thứ hai, include đẩy và bật một đối tượng bối cảnh trên ngăn xếp giải quyết, có nghĩa là giá trị được tạo trong ngữ cảnh trong khi trong phần bao gồm sẽ nằm ngoài phạm vi khi nó trả về.

Quy tắc của tôi là: tạo base.html tệp mẫu xác định cấu trúc tổng thể của trang web của bạn và sử dụng số tiền tự do là {% block foo %} xung quanh các khu vực quan trọng. Sau đó, tất cả các mẫu khác của bạn extends cơ sở (hoặc thứ gì đó tự mở rộng cơ sở) và bạn thay thế các khối đó nếu cần.

include, mặt khác, là tốt cho việc đóng gói những thứ bạn có thể cần phải sử dụng ở nhiều nơi, thậm chí có thể trên cùng một trang.

Cập nhật:

Tôi đã được sử dụng thư viện riêng của tôi về template_tags quá lâu mà tôi quên rằng ngôn ngữ mẫu Django vẫn có những khoảng trống lớn trong chức năng. Thẻ được đề cập ở đây là từ đoạn django đầu có tên là expr mà tôi đã chỉnh sửa và mở rộng nhiều. Bạn có thể nói, ví dụ: {% expr 'Fred' as name %} (hoặc bất kỳ biểu thức Python hợp lệ nào) và nó sẽ lưu trữ kết quả trong vị trí 'tên' trong ngữ cảnh hiện tại. Nếu điều này xảy ra trong mẫu included, giá trị của name sẽ xuất hiện khi thoát khỏi tệp mẫu.

Bạn có thể sắp xếp điều này bằng thẻ {% with %}, nhưng expr mang lại cho tôi sự linh hoạt hơn nhiều, bao gồm thực hiện các cuộc gọi phức tạp tùy ý. Điều này ban đầu xuất hiện khi phải tạo ra các đối tượng được lưu trữ phức tạp đòi hỏi các tương tác DBMS đắt tiền mà không thể thực hiện được trong khung nhìn, chúng phải được gọi trong chính khuôn mẫu đó.

Gửi email cho tôi (trong tiểu sử của tôi) nếu bạn cần hiểu rõ hơn về điều này.

+0

Bạn có thể giải thích điều này bằng ví dụ: 'giá trị được tạo trong ngữ cảnh trong khi bao gồm sẽ nằm ngoài phạm vi khi nó trả về' – Medorator

2

(bạn mình)

Những gì tôi thực sự có nghĩa là đã được xác định một base.html vì vậy bạn có thể kế thừa cơ sở mẫu nhất quán của một số phần chung, chương trình này bao gồm các loại tài liệu, phần tử html định nghĩa 3 khối cho nội dung và nav và tùy chọn khu vực để ghi đè/chèn các phần tử script/link trong phần đầu.

<!doctype> 
<html> 
<head> 
{%block extrahead %} {%endblock %} 
</head> 
{%block nav %} 
<nav> 
    <ul> 
    <li>home</li> 
    </ul> 
</nav> 
<div id="content"> 
{% endblock %} 
{%block content %} 
{% endblock %} 
</div> 
</html> 

Sau đó, bạn có thể định nghĩa homepage.html:

{% extends "base.html" %} 

{% block content %} 
homepage content 
{% endblock %} 

homepage.html sau đó sẽ phải chuyển hướng vì nó kéo dài base.html.

1

Trong trường hợp này, việc đặt menu trong base.html và kéo dài từ điều này có vẻ hợp lý hơn.

including là công cụ tuyệt vời để tách mẫu phức tạp và sử dụng lại các đoạn đó.

giả sử bạn sử dụng cùng một kiểu danh sách ở các vị trí khác nhau của trang web, nhưng bạn gửi truy vấn khác cho nó. miễn là bạn gọi querysets giống nhau, bạn chỉ cần viết mã mẫu một lần.

Here Tôi sử dụng các mẫu khác nhau cho các yêu cầu bình thường và ajax. Nhưng việc sử dụng bao gồm cho phép tôi sử dụng lại hầu hết các phần trong cả hai mẫu

Các vấn đề liên quan