2012-03-08 30 views
7

Tôi không chắc chắn nếu những gì tôi muốn làm là có thể: Tôi đang cố gắng để có được một khối trong một mẫu cha được điền bởi một tập tin được bao gồm trong một mẫu con của phụ huynh.Sử dụng các khối từ các tệp được đính kèm cho phụ huynh trong jinja2

Cách tốt nhất để giải thích đây là một trường hợp thử nghiệm:

file t1.djhtml:

<root> 
    <block t3_container> 
     {% block t3 %}This should be 'CONTENT'{% endblock %} 
    </block t3_container> 

    <block t2_container> 
    {% block t2 %}{% endblock %} 
    </block t2_container> 
</root> 

file t2.djhtml:

{% extends 't1.djhtml' %} 

{% block t2 %} 
     <block t2> 
      {%- include 't3.djhtml' with context %} 
     </block t2> 
{% endblock %} 

file t3 .djhtml:

{% block t3 %} 
     <block t3> 
      CONTENT 
     </block t3> 
{% endblock %} 

file test.py:

from jinja2 import Environment, FileSystemLoader 
env = Environment(loader=FileSystemLoader('')) 
t=env.get_template('t2.djhtml') 
print t.render() 

Đầu ra là:

<root> 
    <block t3_container> 
     This should be 'CONTENT' 
    </block t3_container> 

    <block t2_container> 

     <block t2> 
     <block t3> 
      CONTENT 
     </block t3> 

     </block t2> 

    </block t2_container> 
</root> 

Khối t2 nên để trống, và t3_container nên có nội dung khối t3 's bên trong. Làm cách nào để tôi thực hiện việc này?

Trả lời

4

Để trả lời câu hỏi của riêng tôi, bạn có thể sử dụng macro trong tệp được bao gồm, nhưng thay vì bao gồm nó, bạn nhập macro bằng ngữ cảnh.

//File T1 
<root> 
    <block t3_container> 
    {% block t3 %}{% endblock %} 
    </block t3_container> 

    <block t2_container> 
    {% block t2 %}{% endblock %} 
    </block t2_container> 
</root> 

// File T2 
{% extends 't1.djhtml' %} 
{%- from 't3.djhtml' import inner, inner2 with context %} 

{% block t3 %} 
    {{inner2()}} 
{% endblock %} 

{% block t2 %} 
    <block t2> 
     {{ inner() }} 
    </block t2> 
{% endblock %} 

// File T3 
{% macro inner2() %} 
    <block t3> 
     CONTENT '{{foo+1}}' 
    </block t3> 
{% endmacro %} 

{% macro inner() %} 
    hello 
{% endmacro %} 

// test.py 
from jinja2 import Environment, FileSystemLoader 
env = Environment(loader=FileSystemLoader('')) 
t=env.get_template('t2.djhtml') 
print t.render({ 'foo' : 122 }) 
+0

Cảm ơn bạn đã quay lại và thêm giải pháp của bạn @Richard! Giải pháp này hoạt động rất tốt và chỉ lưu lại đêm của tôi – gtalarico

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