2012-01-03 41 views
24

Giả sử tôi có ba tệp mẫu html được hiển thị bên dưới. HTML là tối thiểu chỉ để minh họa điểm.Mẫu đa cấp Django mở rộng và khối lồng nhau

Có thể bằng cách nào đó lồng một khối có tên là extra_head_content bên trong một khối đã được đặt tên là extra_head_content. Ý tưởng là để cho phép mẫu cấp thứ ba cung cấp một khối có tên là extra_head_content. Mẫu trên nó lấy nội dung đó, thêm nó vào khối của nó có tên là extra_head_content và cung cấp khối kết hợp này cho mẫu cha của nó.

Về cơ bản, tôi đang tìm khối lồng trong các tệp mẫu được kế thừa.

Kịch bản chính xác mà tôi đang cố gắng giải quyết là bất kỳ mẫu nào đều có thể thêm tệp javascript hoặc css bổ sung vào phần tử đầu. Tuy nhiên, các mẫu thấp nhất không nên quan tâm bao nhiêu cấp độ xuống nó được lồng nhau. Tương tự, nội dung đầu phụ được cung cấp bởi mẫu trung gian không được ghi đè bởi phần tử khối của mẫu thiết bị đầu cuối.

base.html

<html> 
<head> 
    <link rel="stylesheet" type="text/css" href="/static/css/reset.css" /> 
    {% block extra_head_content %}{% endblock %} 
</head> 
<body>{% block content %}{% endblock %} 
</html> 

account.html

{% extends "base.html" %} 

{% block extra_head_content %} 
    <link rel="stylesheet" type="text/css" href="/static/css/account.css" /> 
    {% block extra_head_content %}{% endblock %} 
{% endblock %} 

{% block content %} 
    <div id="menu">...</div> 
    {% block account_content %}{% endblock %} 
{% endblock %} 

account_profile.html

{% extends "account.html" %} 

{% block extra_head_content %} 
    <link rel="stylesheet" type="text/css" href="/static/css/edit_profile.css" /> 
{% endblock %} 

{% block account_content %} 
    Welcome to your profile 
{% endblock %} 

Trả lời

49

Không, nhưng bạn có thể sử dụng {{ block.super }}:

{% block extra_head_content %} 
    {{ block.super }} 
    <link rel="stylesheet" type="text/css" href="/static/css/account.css" /> 
{% endblock %} 
2

Module django-sekizai chăm sóc Ngoài css và javascript một cách dễ dàng:

#base.html 
{% load sekizai_tags %} 
# define your template, declaring blocks for inheriting templates: 
{% block content %} 
{% endblock content %} 
# at the bottom of the body: 
{% render_block "js" %} 
</body> 
</html> 

#my_template.html 
{% extends "base.html" %} 
{% load sekizai_tags %} 
{% block content %} 
# content goes here... 
# so does the addtoblock tag 
    {% addtoblock "js" %} 
     <script src="my/awesome/script.js"></script> 
    {% endaddtoblock %} 
{% endblock content %} 
# Note no addtoblock tags outside the block-endblock tags 

Các sekazai docs làm rõ những hãy cẩn thận khi sử dụng hệ thống này, cụ thể là:

  1. render_block chỉ nên được sử dụng bên ngoài không thể sử dụng các thẻ chặn
  2. render_block trong các mẫu được bao gồm
  3. addtoblock nên được sử dụng trong thẻ chặn khi được sử dụng trong mẫu được bao gồm
+1

django-sekizai là rất hữu ích ... Tôi không thể tìm thấy bất kỳ tham chiếu đến nó được vận chuyển với Django bây giờ mặc dù? AFAICT nó vẫn là một mô-đun bên thứ 3 – Anentropic

+0

Cảm ơn bạn đã chọn điều đó! Nó dường như được bao gồm trong Django CMS 2.2 và sau đó, nhưng không Django chính nó hiện nay, vì vậy tôi đã sửa chữa câu trả lời của tôi. –

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