ऐसा लगता है जैसे आपका लेआउट ठोस है। आप आप अपने ऐप्लिकेशन में प्रत्येक पृष्ठ के लिए बुनियादी संरचना और बाहरी लेआउट को परिभाषित करता है एक 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 - सवाल पूछें"
यह नहीं है कि Django का उपयोग कैसे किया जाना चाहिए। –
@ फ्रैंक क्रूक: समझाने की देखभाल? –
@csunwold: मेरे पास वास्तव में समय नहीं है, या मैंने अभी सवाल का जवाब दिया होगा। संक्षिप्त होने के लिए, सवाल किसी ऐसे व्यक्ति से आता है जिसकी मूलभूत गलतफहमी है कि Django के templating सिस्टम में ब्लॉक और विरासत कैसे काम करती है। आपका उत्तर उनके लिए यह स्पष्ट नहीं करता है, इसके बजाय यह ब्लॉक और विरासत के विषय पर पूरी तरह से कूदता है और एक उदाहरण दिखाता है जहां उनका उपयोग नहीं किया जाता है। –