2012-01-27 4 views
10

मैं निम्नलिखित है:एक विस्तारित टेम्पलेट से एक `include`d खाके में एक ब्लॉक को ओवरराइट करने

base.html

<html> 
    {% include 'header.html' %} 
    <div> 
    {% block content %}Default Content{% endblock %} 
    </div> 
</html> 

header.html

<header> 
    {% block logo %}Logo 1{% endblock %} 
</header> 

homepage.html

{% extend 'base.html' %} 
{% block logo %}Logo 2{% endblock %} 
{% block content %}Yap Yap Yap{% endblock %} 

अनिवार्य रूप से, यह काम नहीं करता है। जब मैं homepage.html प्रस्तुत करना मैं:

<html> 
    <header>Logo 1</header> 
    <div>Yap Yap Yap</div> 
</html> 

लेकिन अगर मैं base.html में header.html में कोड के लिए कदम (अर्थात include पूरी तरह से छुटकारा पाने के) यह ठीक काम करता है। क्या कोई यह समझा सकता है कि यह मामला क्यों है?

मुझे लगता है कि included टेम्पलेट्स को उनके माता-पिता के प्रस्तुत होने के बाद प्रस्तुत किया जा रहा है?

उत्तर

9

from the docs

को शामिल टैग के एक कार्यान्वयन के रूप में विचार किया जाना चाहिए "इस subtemplate प्रस्तुत करना और एचटीएमएल में शामिल हैं", नहीं के रूप में "इस subtemplate पार्स और उसकी सामग्री को शामिल जैसे कि वह माता-पिता का हिस्सा थे" । इसका मतलब है कि शामिल टेम्पलेट्स के बीच कोई साझा स्थिति नहीं है - प्रत्येक में एक पूरी तरह से स्वतंत्र प्रतिपादन प्रक्रिया शामिल है।

तो subtemplate (header.html) पूरी तरह से प्रदान की गई और माता पिता के टेम्पलेट (base.html) में डाला जा रहा है, जिसका अर्थ है वहाँ बच्चे टेम्पलेट (homepage.html) के लिए ब्लॉक की कोई अवधारणा अधिलेखित करने के लिए

0

आप ओवरराइट नहीं कर सकते है मुखपृष्ठ.html से लोगो क्योंकि यह मूल टेम्पलेट में स्वयं परिभाषित नहीं है।

समाधान के रूप में आप का प्रस्ताव, base.html

5

यह एक ज्ञात सीमा है कि हमें आशा है कि एक निकट भविष्य में हल किया जा रहा है में header.html कोड स्थानांतरित करने के लिए, है।

वैसे, यह मानते हुए कि आपके पास एक और जटिल समस्या है जिसका आपने उल्लेख किया है, इसके लिए एक और काम हेडर को एक ब्लॉक बना रहा है और इस ब्लॉक को एक नए कस्टम के साथ ओवरराइड करने से है।

base.html

<html> 
    {% block header %} 
     {% include 'header.html' %} 
    {% endblock %} 
    <div> 
     {% block content %}Default Content{% endblock %} 
    </div> 
</html> 

header.html

<header> 
    {% block logo %}Logo 1{% endblock %} 
</header> 

होमपेज पर।एचटीएमएल

{% extends 'base.html' %} 

{% block header %} 
    {% include 'homepage_header.html' %} 
{% endblock %} 

{% block content %}Yap Yap Yap{% endblock %} 

homepage_header.html

{% extends 'header.html' %} 

{% block logo %}Logo 2{% endblock %} 
1

मैं एक ऐसी ही समस्या थी। मैं प्रपत्र

{% extends 'base.html' %} 
{% include 'filtered_table.html' %} 

जहां filtered_table.html है की है जो किसी फ़िल्टर किए गए तालिका टेम्पलेट है:

{% load render_table from django_tables2 %} 
<div class="panel-body" > 
    <form method='GET'> 
    <div class="search-form" style="border: 1px solid #000000; background-color:#a3ffaf; overflow: auto;"> 
{% block render_form %} 
    {% for field in filter.form %} 
     {{ field.errors }} 
     {{ field.label_tag }} {{ field }} 
    {% endfor %} 
{% endblock %} 
    <input type='submit' value='Filter' /> 
    | 
    Displaying {{ filter.qs.count }} of {{ filter.queryset.count }} {{ object_name }}s. 
    | 
    <a href='{{ request.path }}' >Clear</a> <p> 
    </div> 

{% if table %} 
    {% render_table table %} 
{% endif %} 

</form> 

</div> 

मैं चाहते हो सकता है इस तरह प्रत्येक क्षेत्र वर्तनी द्वारा विशेष रूप से हाथ से शिल्प रूप है, उदाहरण के लिए करने के लिए :

{% block render_form %} 
{{ filter.form.field1.errors }} 
{{ filter.form.field1.label_tag }} 
{{ filter.form.field1 }} 
<p> 

{{ filter.form.field2.errors }} 
{{ filter.form.field2.label_tag }} 
{{ filter.form.field2 }} 
{% endblock %} 

दुर्भाग्य से, क्योंकि मैं ऐसा नहीं कर सकते "फैली" दो बार, मैं नहीं मेरा आधार लेआउट हो और फ़िल्टर्ड तालिका अनुकूलित कर सकते हैं। तो बदसूरत (क्योंकि एचटीएमएल संरचना को आधे में तोड़ता है) ऐसा करने के लिए बस start_filtered_table.html और end_filtered_table.html परिभाषित करना है। तब अनुकूलित मामले में मैं अनुकूलन लपेटकर शामिल दो है, और uncustomized मामले के लिए, filtered_form.html इस तरह परिभाषित किया गया है:

{% include "begin_filtered_table.html" %} 

    {% for field in filter.form %} 
     {{ field.errors }} 
     {{ field.label_tag }} {{ field }} 
    {% endfor %} 

{% include "end_filtered_table.html" %} 

यह सकल जा रहा है की कीमत पर समस्या का हल। एकाधिक विस्तार की अनुमति देने के लिए यह बहुत आसान होगा।

संबंधित मुद्दे