2009-07-24 9 views
15
<html> 
    <head> 
     <title>{% block title %}{% endblock %}</title> 
    </head> 

    <body> 
     <h1>{% block title %}{% endblock %}</h1> 
    </body> 
</html> 

यह कम या ज्यादा मेरे टेम्पलेट है। एच 1 शीर्षक हमेशा शीर्षक टैग के समान होता है। कोड का उपरोक्त स्निपेट मान्य नहीं है क्योंकि एक ही नाम के साथ दो ब्लॉक नहीं हो सकते हैं। मैं इसे दोहराने के बिना कैसे संभाल सकता हूं? स्पष्ट करने के लिएक्या एक Django टेम्पलेट में डेटा डुप्लिकेट करने के लिए सबसे अच्छा तरीका है?


संपादित करें: मैं बच्चे टेम्पलेट्स के एक टन है जो इस एक टेम्पलेट से लिए गए हैं, और इसलिए प्रत्येक टेम्पलेट के लिए एक नया {{title}} वैरिएबल बनाने एक बहुत अच्छा समाधान नहीं है। इससे पहले मैं इसे इस तरह की स्थापना की थी:

base.html:

<title>{% block title %}{% endblock %}</title> 

तो base_view.html (विस्तार base.html) में:

<h1>{% block title %}{% endblock %}</h1> 
तो base_object.html में

(विस्तार base_view.html):

{% block title %}my title goes here{% endblock %} 

और यह किसी भी तरह से काम करता है। मैं अपने टेम्पलेट्स पुनर्संशोधित तो थेरेस सिर्फ base.html, और base_object.html कैसे मैं वापस इस कार्यक्षमता मिल सकता है?

उत्तर

8

ऐसा लगता है जैसे आपका लेआउट ठोस है। आप आप अपने ऐप्लिकेशन में प्रत्येक पृष्ठ के लिए बुनियादी संरचना और बाहरी लेआउट को परिभाषित करता है एक base.html टेम्पलेट है। तुम भी base_object.html कि इस टेम्पलेट का विस्तार किया है।

आप चाहते हैं कि प्रत्येक पृष्ठ में एक अद्वितीय शीर्षक और मिलान वाला एच 1 (मुझे लगता है)। ऐसा करने का यह सबसे अच्छा तरीका है अपने base.html टेम्पलेट में दो अलग-अलग ब्लॉक को परिभाषित करना।

<html> 
    <head> 
     <title>{% block title %}Default Title{% endblock %}</title> 
    </head> 

    <body> 
     <h1>{% block h1 %}{% endblock %}</h1> 
    </body> 
</html> 

अपने बच्चे के टेम्पलेट्स में, यदि आप उन्हें समान बनाना चाहते हैं तो आपको इन दोनों को ओवरराइड करने की आवश्यकता है। मुझे पता है कि आपको लगता है कि यह प्रतिद्वंद्वी है, लेकिन Django में टेम्पलेट विरासत को संभालने के तरीके के कारण यह जरूरी है।

स्रोत: The Django template language

अंत में, ध्यान दें कि आप एक ही टेम्पलेट में एक ही नाम के साथ कई {% block %} टैग को परिभाषित नहीं कर सकते हैं। यह सीमा मौजूद है क्योंकि एक ब्लॉक टैग "दोनों" दिशाओं में काम करता है। यही है, एक ब्लॉक टैग सिर्फ भरने के लिए एक छेद प्रदान नहीं करता है - यह उस सामग्री को भी परिभाषित करता है जो पैरेंट में छेद भरता है। यदि टेम्पलेट में दो समान नामित {% block %} टैग थे, तो उस टेम्पलेट के माता-पिता को यह नहीं पता होगा कि ब्लॉक में से कौन सी सामग्री का उपयोग करना है।

बच्चों को इस तरह लग रहे:

{% extends "base.html" %} 
{% block title %}Title{% endblock %} 
{% block h1 %}Title{% endblock %} 

यह आप परेशान हैं, तो आप एक टेम्पलेट चर के रूप में प्रत्येक वस्तु के लिए देखने से शीर्षक स्थापित करना चाहिए।

{% block title %}{{ title }}{% endblock %} 
{% block h1 %}{{ title }}{% endblock %} 

Django जितना संभव हो सके टेम्पलेट परत से अधिक तर्क रखने का प्रयास करता है। अक्सर एक शीर्षक डेटाबेस से गतिशील रूप से निर्धारित किया जाता है, इसलिए दृश्य परत पुनर्प्राप्त करने और सेट करने के लिए एकदम सही जगह है। तुम अब भी शीर्षक खाली छोड़ सकते हैं यदि आप डिफ़ॉल्ट खिताब के लिए स्थगित करना चाहते हैं (शायद base.html में सेट, या आप django.contrib.sites पैकेज से साइट का नाम प्राप्त कर सकते हैं)

इसके अलावा {{ block.super }} काम में आ सकते हैं। यह आपको बच्चे से अतिरिक्त सामग्री के साथ मूल ब्लॉक की सामग्री को गठबंधन करने की अनुमति देगा। तो अगर आप की तरह एक शीर्षक प्राप्त करने के लिए बच्चे में "Stackoverflow.com" आधार में की तरह एक शीर्षक निर्धारित कर सकते हैं, और सेट

{% block title %}{{ block.super }} - Ask a Question{% endblock %} 

"Stackoverflow.com - सवाल पूछें"

1

अपने टेम्पलेट, हो सकता है कहा जाता खिताब के लिए एक चर दर्रा। फिर {शीर्षक}} के साथ अपने शीर्षक ब्लॉक को प्रतिस्थापित करें। आपके विचार में अपने खाके में यह पारित करने के लिए सुनिश्चित करें कि आपके:

def myview(request): 
    t = loader.get_template("mypage.html") 
    title = "My Title" 
    c = Context({"title" : title }) 
    HttpResponse(t.render(c)) 

फिर अपने टेम्पलेट में आप होगा:

<html> 
<head> 
    <title>{{ title }}</title> 
</head> 

<body> 
    <h1>{{ title }}}</h1> 
</body> 

यह भी देखें: How to repeat a "block" in a django template

+0

यह नहीं है कि Django का उपयोग कैसे किया जाना चाहिए। –

+0

@ फ्रैंक क्रूक: समझाने की देखभाल? –

+0

@csunwold: मेरे पास वास्तव में समय नहीं है, या मैंने अभी सवाल का जवाब दिया होगा। संक्षिप्त होने के लिए, सवाल किसी ऐसे व्यक्ति से आता है जिसकी मूलभूत गलतफहमी है कि Django के templating सिस्टम में ब्लॉक और विरासत कैसे काम करती है। आपका उत्तर उनके लिए यह स्पष्ट नहीं करता है, इसके बजाय यह ब्लॉक और विरासत के विषय पर पूरी तरह से कूदता है और एक उदाहरण दिखाता है जहां उनका उपयोग नहीं किया जाता है। –

8
{% extends "base.html" %} 

{% with "Entry Title" as title %} 
    {% block title %}{{ title }}{% endblock %} 
    {% block h1 %}{{ title }}{% endblock %} 
{% endwith %} 

कि यदि आप वास्तव में विचारों में से title को रखने और खुद को दोहराने के बारे में चिंतित हैं तो काम कर सकते हैं।

20

base.html में:

<head> 
    <title>{% block title %}{% endblock %}</title> 
</head> 

<body> 
    <h1>{% block h1 %}{% endblock %}</h1> 
</body> 

फिर, कि कहा जाता content_base.html के शीर्ष (या कुछ और) पर एक और "आधार" परत बनाने:

{% extends "base.html" %} 

{% block h1 %}{% block title %}{% endblock %}{% endblock %} 

अब आपके सभी अन्य टेम्पलेट्स content_base.html का विस्तार करें। जो कुछ भी आप अपने सभी टेम्पलेट्स में ब्लॉक "शीर्षक" में डालते हैं, वह base.html में "शीर्षक" और "एच 1" ब्लॉक दोनों में जाएगा।

+0

ओच, लेकिन मुझे लगता है कि यह काम करेगा। – mlissner

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