django टेम्प्लेट: शामिल हैं और फैली हुई हैं


108

मैं 2 अलग-अलग आधार फ़ाइलों के अंदर एक ही सामग्री प्रदान करना चाहूंगा।

तो मैं यह करने की कोशिश कर रहा हूँ:

page1.html:

{% extends "base1.html" %}
{% include "commondata.html" %}

page2.html:

{% extends "base2.html" %} 
{% include "commondata.html" %}

समस्या यह है कि मैं दोनों का उपयोग और शामिल करने के लिए प्रतीत नहीं कर सकता। क्या ऐसा करने का कोई तरीका है? और यदि नहीं, तो मैं उपरोक्त कैसे पूरा कर सकता हूं?

commondata.html एक ब्लॉक को ओवरराइड करता है जो कि base1.html और base2.html दोनों में निर्दिष्ट है

इसका उद्देश्य पीडीएफ और एचटीएमएल प्रारूप दोनों में एक ही पृष्ठ प्रदान करना है, जहां प्रारूपण थोड़ा अलग है। उपरोक्त प्रश्न हालांकि सरल करता है कि मैं क्या करने की कोशिश कर रहा हूं अगर मुझे इस बात का जवाब मिल सकता है कि यह मेरी समस्या को हल कर देगा।

जवाबों:


110

जब आप एक्सटेंडेड टेम्प्लेट टैग का उपयोग करते हैं, तो आप कह रहे हैं कि वर्तमान टेम्प्लेट एक और फैली हुई है - कि यह एक चाइल्ड टेम्प्लेट है, जो एक पेरेंट टेम्पलेट पर निर्भर है। Django आपके बच्चे के टेम्पलेट को देखेगा और इसकी सामग्री का उपयोग माता-पिता को आबाद करने के लिए करेगा।

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

Django प्रलेखन में मूल टेम्पलेट में ब्लॉक को बदलने के लिए ब्लॉक का उपयोग करने के कुछ बहुत अच्छे उदाहरण हैं।

https://docs.djangoproject.com/en/dev/ref/templates/language/#template-inheritance


1
मेरे commondata.html में ब्लॉक परिभाषित है। लेकिन यह पैरेंट टेम्प्लेट के ब्लॉक को रिप्लेस नहीं कर रहा है ... अगर इसमें शामिल करने के बजाय मैं पेज 1 और पेज 2 में दोनों बार सटीक डेटा लिखता हूं, तो निश्चित रूप से यह काम करता है। लेकिन मैं उस समानता को commondata.html में बताना चाहता हूं।
नेट सिटीजन

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

1
नीचे दिए गए मेरे जवाब को देखें कि यह मेरे लिए पहली बार क्यों काम नहीं किया, मैं आपको स्वीकृत जवाब के साथ छोड़ दूँगा, क्योंकि आपने मेरे द्वारा पूछे गए प्रश्न का सही उत्तर दिया।
नेट सिटीजन

80

Django डॉक्स से:

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

तो Django आपके commondata.html से किसी भी ब्लॉक को नहीं पकड़ता है और यह नहीं जानता कि ब्लॉक किए गए HTML के साथ क्या करना है।


32

यह आपके लिए चाल करना चाहिए: एक ब्लॉक सेक्शन के अंदर टैग शामिल करें।

page1.html:

{% extends "base1.html" %}

{% block foo %}
   {% include "commondata.html" %}
{% endblock %}

page2.html:

{% extends "base2.html" %}

{% block bar %}
   {% include "commondata.html" %}
{% endblock %}

1
उत्तम। मेरे लिये कार्य करता है।
तृप्ति एम पांचाल

13

भविष्य के लोगों की मदद करने के मामले में मेरे लिए यह क्यों काम नहीं कर रहा है इसके बारे में अधिक जानकारी:

यह काम नहीं करने का कारण यह है कि django में {% में%} शामिल हैं, फैंसी अपोस्ट्रोफ जैसे विशेष पात्रों को पसंद नहीं करता है। मैं जिस टेम्प्लेट डेटा को शामिल करने की कोशिश कर रहा था, वह शब्द से चिपकाया गया था। मुझे इन सभी विशेष पात्रों को मैन्युअल रूप से निकालना पड़ा और फिर इसमें सफलतापूर्वक शामिल किया गया।


3

आप मूल टेम्पलेट के ब्लॉक को ओवरराइड करने के लिए एक शामिल फ़ाइल से एक बाल टेम्पलेट में ब्लॉकों में नहीं खींच सकते। हालाँकि, आप एक चर में एक माता-पिता को निर्दिष्ट कर सकते हैं और संदर्भ में आधार टेम्पलेट निर्दिष्ट कर सकते हैं।

से प्रलेखन :

{% चर% का विस्तार करता है} चर के मूल्य का उपयोग करता है। यदि चर स्ट्रिंग का मूल्यांकन करता है, तो Django उस स्ट्रिंग को मूल टेम्पलेट के नाम के रूप में उपयोग करेगा। यदि चर टेम्प्लेट ऑब्जेक्ट का मूल्यांकन करता है, तो Django उस ऑब्जेक्ट को मूल टेम्पलेट के रूप में उपयोग करेगा।

अलग "page1.html" और "page2.html" के बजाय, "commondata.html" {% extends base_template %}के शीर्ष पर रखें। और फिर आपके विचार में, base_template"base1.html" या "base2.html" को परिभाषित करें।


2

भविष्य में उन लोगों के संदर्भ में जोड़ा गया है जो इसे Google के माध्यम से ढूंढते हैं: आप इस तरह के मामलों के लिए मेज़ानाइन लाइब्रेरी द्वारा प्रदान किए गए {% overextend%} टैग को देखना चाह सकते हैं।


1

१० दिसंबर २०१५ को संपादित करें : जैसा कि टिप्पणियों में बताया गया है, संस्करण १.। के बाद से ssi को हटा दिया गया है। प्रलेखन के अनुसार:

इस टैग को हटा दिया गया है और इसे Django 1.10 में हटा दिया जाएगा। इसके बजाय शामिल टैग का उपयोग करें।


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

हालाँकि, मुझे कुछ आश्चर्य हुआ कि किसी ने भी Django टेम्प्लेटिंग सिस्टम द्वारा प्रदान किए गए ssi टैग का उल्लेख नहीं किया है, जो विशेष रूप से इनलाइन के लिए पाठ के बाहरी टुकड़े सहित डिज़ाइन किया गया है । यहां, इनलाइन का अर्थ है बाहरी पाठ की व्याख्या, पार्स या इंटरपोलित नहीं की जाएगी, लेकिन कॉलिंग टेम्प्लेट के अंदर बस "कॉपी" किया जाएगा।

कृपया, आगे के विवरण के लिए दस्तावेज़ीकरण देखें (पृष्ठ के निचले दाहिने भाग में चयनकर्ता में Django के अपने उपयुक्त संस्करण की जांच करना सुनिश्चित करें)।

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi

प्रलेखन से:

ssi
Outputs the contents of a given file into the page.
Like a simple include tag, {% ssi %} includes the contents of another file
 which must be specified using an absolute path  in the current page

इस तकनीक के सुरक्षा निहितार्थों से भी सावधान रहें और आवश्यक ALLOWED_INCLUDE_ROOTS को भी परिभाषित करें, जिसे आपकी सेटिंग्स फाइलों में जोड़ा जाना चाहिए।


1
ध्यान दें, 1.8 के रूप में, ssi शामिल के पक्ष में पदावनत किया गया है। https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#std:templatetag-include
Tim S.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.