2012-03-09 6 views
28

मेरे पास कुछ HTML संरचनाएं हैं जिनका उपयोग कुछ अलग-अलग स्थानों में किया जाता है। यह एक समग्र टेम्पलेट से अलग है, इसलिए मैं इसे विस्तारित नहीं कर सकता, इसका उपयोग जटिल सामग्री को भी शामिल करने के लिए किया जा सकता है, इसलिए मुझे लगता है कि इसे टेम्पलेट टैग के रूप में परिभाषित करना अच्छा काम नहीं करता है। नीचे कुछ छद्म कोड टेम्पलेट_लेवल 2.html का उपयोग करते समय, मेरे वांछित परिणाम का वर्णन करते हुए, आप आसानी से इसके अंदर ब्लॉक को कॉल करके reusable_pattern_template में सामान डाल सकते हैं। यदि मैं इस कोड का उपयोग करता हूं, तो आप टेम्पलेट_लेवल_2.html की 'वास्तविक सामग्री' में जो भी लिखते हैं, वह दिखाई नहीं देगा। मुझे इसका कैसे सामना करना चाहिए?django: शामिल टेम्पलेट्स में ब्लॉक का उपयोग

base.html

<html> 
<head></head> 
<body> 
{% block content %}{% endblock %} 
</body> 
</html> 

template_level1.html

{% extends 'base.html' %} 
{% block content %} 
    Something here... 
    {% include 'reusable_pattern_template.html' %} 
    Something else here... 
{% endblock %} 

reusable_pattern_template.html

<div> 
    <div> 
    <div> 
     {% block local_content %}{% endblock %} 
    </div> 
    </div> 
</div> 

template_level2.html

{% extends 'template_level1.html' %} 
{% block local_content %} 
    Actual content here... 
{% endblock %} 

अद्यतन: क्षमा करें, template_level2.html में विस्तारित कुछ गलत वर्तनी है, मैंने इसे अभी ठीक किया है।

यह बहुत स्पष्ट नहीं हो सकता है, लेकिन ऊपर दिया गया कोड मेरे वांछित परिणाम का वर्णन करने वाले छद्म कोड से अधिक है। संक्षेप में,

  • मैं अपने टेम्पलेट्स में पुन: प्रयोज्य HTML पैटर्न के छोटे टुकड़े शामिल करना चाहता हूं।
  • ये पैटर्न बॉक्स की तरह हैं, आप इन्हें HTML सामग्री के पूरे टुकड़े डाल सकते हैं। तो संदर्भ चर के लिए बहुत सीमित हो सकता है मेरा उद्देश्य
+0

ऐसा लगता है कि 'template_level2.html' कभी नहीं कहा जाता है। और यदि आप कोड के कुछ ब्लॉक शामिल करते हैं, तो आपको 'ब्लॉक' कथन का उपयोग करने की आवश्यकता नहीं है क्योंकि आप कब और क्या चाहते हैं –

+0

हाय फास्टलोड! 'template_level2.html' टेम्पलेट का अंतिम स्तर है, इसलिए इसे कहीं भी शामिल/विस्तारित नहीं किया गया है। 'Template_level2.html' में '{% block%}' कथन को कॉल करके, मैं सामग्री को' reusable_pattern_template.html' में रखना चाहता था, जिसका उपयोग 'template_level2.html' –

+0

में किया गया है प्रश्न: क्यों django-generic-flatblocks का उपयोग नहीं करते? यह एक शानदार ऐप है जो एक महान पैटर्न प्रदान करता है। – jpic

उत्तर

40

Django शामिल फ़ाइलों में ब्लॉक को संसाधित नहीं करता है।

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

+7

दृश्य से वेरिएबल अभी भी साझा किए गए हैं और पार्स किए गए हैं। –

+0

संदर्भ टेम्पलेट्स को संदर्भ भी दिया गया है (यह उपर्युक्त टिप्पणी जैसा ही हो सकता है, लेकिन 'संदर्भ' दृश्य से चर से अधिक मान्यता प्राप्त है।) –

+7

सहायक स्पष्टीकरण, लेकिन _is_ क्या ओपी था जो करने के लिए एक टैग या अन्य विधि के लिए उम्मीद? मैं भी, एक टेम्पलेट शामिल करने में सक्षम होना चाहता हूं, और फिर भी टेम्पलेट विरासत – Ben

3

यह है कि अंतिम स्वयं टेम्पलेट को विस्तार करने के लिए (अगर यह उद्धरण में था) कोशिश कर रहा है लगता है।

आपको वास्तव में उस जटिलता की आवश्यकता नहीं है। यह वास्तव में बहुत आसान है।

बेस टेम्पलेट को आपके टेम्पलेट के कंकाल को पकड़ना चाहिए, फिर आप इसे अनुकूलन करने के लिए बढ़ा सकते हैं। पुन: प्रयोज्य कोड ब्लॉक के लिए जिन्हें आप अपने प्रत्येक दृश्य में शामिल नहीं करना चाहते हैं, include जहां उचित हो, लेकिन शामिल फ़ाइल में block, extends या include कथन का उपयोग न करें। Django उन लोगों को पार्स नहीं करेगा लेकिन दृश्य से पारित context variable अभी भी उपयोग किया जा सकता है।

0

आप reusable_pattern_template को प्रारंभ और अंत टेम्पलेट्स में विभाजित कर सकते हैं। फिर स्तर 1 में आप प्रारंभ, ब्लॉक, अंत शामिल शामिल कर सकते हैं।

वैकल्पिक रूप से आप टेम्पलेट नाम को reusable_pattern_template में संदर्भ चर के रूप में पास कर सकते हैं और फिर इसे reusable_pattern_template में शामिल कर सकते हैं। इसके लिए आपके उदाहरण में स्तर 1 और स्तर 2 के बीच संबंध बदलने की आवश्यकता होगी लेकिन आमतौर पर अधिक शक्तिशाली है।

1

मैं इस समस्या में आया और निम्नलिखित समझौता के साथ समाप्त हुआ, उम्मीद है कि किसी और को यह उपयोगी लगेगा। यह बच्चे टेम्पलेट्स में with ब्लॉक का उपयोग करने पर निर्भर करता है।

base.html एक आम nav.html शामिल पुन: उपयोग, लेकिन कुछ अवरुद्ध कर देता है nav.html अंदर चर बच्चे टेम्पलेट्स द्वारा ओवरराइड किया जा सकता है परिभाषित करने के लिए चाहता है।

<!-- base.html: --> 
<html> 
    [...] 
    <nav class="desktop"> 
    {% block desktop_nav %} 
     {% include "includes/nav.html" %} 
    {% endblock %} 
    </nav> 
    [...] 
    <nav class="mobile"> 
    {% block mobile_nav %} 
     {% include "includes/nav.html" %} 
    {% endblock %} 
    </nav> 
    [...] 

टेम्पलेट में शामिल हैं, एक चर selected कहा जाता है, जो base.html परिभाषित नहीं करता है पर निर्भर करता है डिफ़ॉल्ट रूप से:

<!--includes/nav.html:--> 
<a href="/about/" class="{% if selected == 'about' %}selected{% endif %}">About</a> 
<a href="/people/" class="{% if selected == 'people' %}selected{% endif %}">People</a> 
<a href="/contact/" class="{% if selected == 'contact' %}selected{% endif %}">Contact</a> 

लेकिन इस प्रकार बच्चे पृष्ठों कि मान को ओवरराइड कर सकते हैं:

<!--about.html:--> 
{% extends "base.html" %} 
{% block desktop_nav %}{% with selected='about' %}{{ block.super }}{% endwith %}{% endblock %} 
{% block mobile_nav %}{% with selected='about' %}{{ block.super }}{% endwith %}{% endblock %} 

तो, सही नहीं है, मुझे अभी भी दो अलग-अलग ब्लॉक हैं और with ब्लॉक दो बार उपयोग करें, लेकिन यह मुझे मूल टेम्पलेट से include ब्लॉक में चर को ओवरराइड करने की अनुमति देता है।