2010-02-24 17 views
12

मेरे दोस्त और मेरे पास एक छोटा तर्क है। मेरे वर्तमान Django प्रोजेक्ट में, मैंने menu.html नामक एक फ़ाइल बनाई है जिसमें कॉन्फ़िगर किए गए लिंक का एक समूह होगा और एक सूची में स्वरूपित होगा।Django: विस्तार या शामिल?

{% include 'menu.html' %} 

हालांकि, मेरे दोस्त का सुझाव दे रहा है कि यह यह करने के लिए गलत तरीका है: इसके बजाय मैन्युअल रूप से प्रत्येक पृष्ठ में मेनू हार्ड-कोड, मैं वर्तमान में निम्नलिखित Django/पायथन कोड का उपयोग कर मेनू शामिल कर रहा हूँ की। उन्होंने कहा कि मैं बजाय शामिल की फैली उपयोग करने के लिए और उसके बाद सामग्री, कुछ इस तरह परिभाषित की जरूरत है:

{% extend 'menu.html' %} 
{% block content %} 
The rest of my content here. 
{% endblock %} 

अतिरिक्त कोड का एक सा है। क्या वास्तव में कोई फर्क पड़ता है जिसका मैं उपयोग करता हूं? मैं पूर्व का उपयोग करना पसंद करूंगा।

उत्तर

12

हां, यह महत्वपूर्ण है। सबसे पहले extends केवल फ़ाइल की पहली पंक्ति के रूप में हो सकता है। दूसरा, include संकल्प स्टैक पर एक संदर्भ ऑब्जेक्ट को धक्का देता है और पॉप करता है, जिसका अर्थ है कि संदर्भ में बनाए गए मान में शामिल होने पर दायरे से बाहर हो जाएगा।

मेरा नियम है: base.html टेम्पलेट फ़ाइलें बनाएं जो आपकी साइट की समग्र संरचना को परिभाषित करती हैं और महत्वपूर्ण क्षेत्रों के आसपास {% block foo %} की उदार राशि का उपयोग करती हैं। फिर आपके सभी अन्य टेम्पलेट extends आधार (या कुछ जो स्वयं आधार को बढ़ाता है) और आप आवश्यकतानुसार उन ब्लॉक को प्रतिस्थापित करते हैं।

include दूसरी तरफ, उन चीजों को समाहित करने के लिए अच्छा है जिन्हें आपको एक से अधिक स्थानों में उपयोग करने की आवश्यकता हो सकती है, शायद उसी पृष्ठ पर भी।

अद्यतन:

मैं इतने लंबे समय मैं भूल जाते हैं कि Django के टेम्पलेट भाषा अभी भी कार्यक्षमता में प्रमुख अंतराल है कि के लिए template_tags के अपने खुद के पुस्तकालय का उपयोग किया गया। यहां प्रश्न में टैग शुरुआती django स्निपेट से है जिसे expr कहा जाता है जिसे मैंने अत्यधिक संपादित और विस्तारित किया है। आप कह सकते हैं, उदाहरण के लिए, {% expr 'Fred' as name %} (या कोई वैध पायथन अभिव्यक्ति), और यह वर्तमान संदर्भ में परिणाम 'नाम' स्लॉट में संग्रहीत करेगा। यदि यह included टेम्पलेट में होता है, तो name का मान टेम्पलेट फ़ाइल से बाहर निकलने पर पॉप किया जाएगा।

आप इसे {% with %} टैग के साथ प्राप्त कर सकते हैं, लेकिन expr मुझे मनमाने ढंग से जटिल कॉल करने सहित बहुत अधिक लचीलापन देता है। मूल रूप से जटिल कैश किए गए ऑब्जेक्ट्स बनाने के लिए यह मूल रूप से आया था, जिसके लिए महंगे डीबीएमएस इंटरैक्शन की आवश्यकता होती थी जिसे दृश्य में नहीं किया जा सका, उन्हें टेम्पलेट में ही शामिल किया जाना था।

मुझे ईमेल करें (मेरी प्रोफ़ाइल में) यदि आपको इसमें गहराई से जाना है।

+0

में अधिकांश हिस्सों का दोबारा उपयोग करने दो। क्या आप इसे एक उदाहरण के साथ समझा सकते हैं: संदर्भ में बनाए गए मान को कवर करते समय दायरे से बाहर हो जाएगा ' – Medorator

2

(उसके दोस्त)

क्या मैं वास्तव में मतलब एक base.html को परिभाषित किया गया था, ताकि आप किसी मूल टेम्पलेट कई सामान्य वर्गों के अनुरूप वारिस कर सकते हैं, यह एक डॉक प्रकार भी शामिल है, एचटीएमएल तत्व सामग्री और एनएवी और वैकल्पिक के लिए 3 ब्लॉक को परिभाषित करता है सिर में स्क्रिप्ट/लिंक तत्वों को ओवरराइड/सम्मिलित करने के लिए क्षेत्र।

<!doctype> 
<html> 
<head> 
{%block extrahead %} {%endblock %} 
</head> 
{%block nav %} 
<nav> 
    <ul> 
    <li>home</li> 
    </ul> 
</nav> 
<div id="content"> 
{% endblock %} 
{%block content %} 
{% endblock %} 
</div> 
</html> 

तो फिर तुम homepage.html परिभाषित कर सकते हैं:

{% extends "base.html" %} 

{% block content %} 
homepage content 
{% endblock %} 

homepage.html तो नेविगेशन के लिए होता है, क्योंकि यह base.html फैली हुई है।

1

इस मामले में मेनू को base.html में रखकर और इससे विस्तार करना अधिक समझदार लगता है।

including जटिल टेम्पलेट को विभाजित करने और उन हिस्सों का पुन: उपयोग करने के लिए बहुत अच्छा है।

मान लें, आप साइट के विभिन्न स्थानों में एक ही सूची-शैली का उपयोग करते हैं, लेकिन आप इसे अन्य क्वेरीसेट भेजते हैं। जब तक आप क्वेरीसेट को वही कहते हैं, आपको केवल एक बार टेम्पलेट कोड लिखना होगा।

Here मैं सामान्य- और AJAX अनुरोधों के लिए भिन्न टेम्पलेट का उपयोग करता हूं। लेकिन उपयोग करने से मुझे दोनों टेम्पलेट्स

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