জ্যাঙ্গো টেমপ্লেট: অন্তর্ভুক্ত এবং প্রসারিত


108

আমি 2 ভিন্ন বেস ফাইলের মধ্যে একই বিষয়বস্তু সরবরাহ করতে চাই।

তাই আমি এটি করার চেষ্টা করছি:

page1.html:

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

page2.html:

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

সমস্যাটি হ'ল আমি প্রসার এবং অন্তর্ভুক্ত উভয়ই ব্যবহার করতে পারি না বলে মনে হয়। এটি করার কোনও উপায় আছে? এবং যদি না হয় তবে আমি কীভাবে উপরেরটি সম্পাদন করতে পারি?

কমন্ডাটা এইচটিএমএল একটি ব্লককে ওভাররাইড করে যা বেস1.html এবং বেস 2.html উভয় ক্ষেত্রেই নির্দিষ্ট করা হয়

এর উদ্দেশ্য হ'ল পিডিএফ এবং এইচটিএমএল উভয় ফর্ম্যাটে একই পৃষ্ঠা সরবরাহ করা, যেখানে বিন্যাসটি কিছুটা আলাদা। উপরের প্রশ্নটি যদিও আমি কী করার চেষ্টা করছি তা সরল করে যদি আমি এর উত্তর পেতে পারি তবে এটি আমার সমস্যার সমাধান করবে।

উত্তর:


110

আপনি যখন প্রসারিত টেম্পলেট ট্যাগটি ব্যবহার করেন, আপনি বলছেন যে বর্তমান টেমপ্লেটটি আরেকটি প্রসারিত করে - এটি কোনও শিশু টেম্পলেট, পিতামাতার টেম্পলেটের উপর নির্ভরশীল। জাজানো আপনার সন্তানের টেম্পলেটটি দেখবে এবং এর সামগ্রীটি পিতামাতাকে জনিত করতে ব্যবহার করবে।

চাইল্ড টেমপ্লেটে আপনি যা ব্যবহার করতে চান তা হ'ল ব্লকের মধ্যে থাকা উচিত, যা জাঙ্গো পিতামাতাকে জনপ্রিয় করতে ব্যবহার করে। যদি আপনি সেই শিশু টেম্পলেটটিতে একটি অন্তর্ভুক্ত বিবৃতি ব্যবহার করতে চান, তবে জাঙ্গো এটির অর্থ বুঝতে আপনাকে এটি একটি ব্লকের মধ্যে রাখতে হবে। অন্যথায় এটি কেবল অর্থবোধ করে না এবং জ্যাঙ্গো এটি কী করবে তা জানে না।

জ্যাঙ্গো ডকুমেন্টেশনে প্যারেন্ট টেম্পলেটে ব্লকগুলি প্রতিস্থাপন করতে ব্লক ব্যবহারের কয়েকটি সত্যই উদাহরণ রয়েছে।

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


1
আমার কমন্ডাটা এইচটিএমএল এর মধ্যে ব্লকটি সংজ্ঞায়িত করা আছে। তবে এটি প্যারেন্ট টেম্পল্টের ব্লকটি প্রতিস্থাপন করছে না ... যদি আমি অন্তর্ভুক্ত না করে পরিবর্তে আমি সঠিকভাবে ডেটা দুটি পৃষ্ঠার এইচটিএমএল এবং পৃষ্ঠা 2 এইচটিএমএল লিখি তবে অবশ্যই এটি কাজ করে। তবে আমি সেই সাধারণতাটি কমন্ডাটা এইচটিএমএলে পরিণত করতে চাই।
নেট নাগরিক

কাজ করা দেখে মনে হচ্ছে, আমি চেষ্টা করে দেখছি তবে আমার অবশ্যই টাইপো বা এমন কিছু থাকতে হবে যাতে এটি কাজ না করে।
নেট নাগরিক

1
প্রথম বার কেন এটি আমার পক্ষে কার্যকর হল না তার জন্য নীচে আমার উত্তরটি দেখুন, আমি আপনাকে গ্রহণযোগ্য উত্তর দিয়ে ছেড়ে দেব যদিও আপনি যে প্রশ্নটি আমি সঠিকভাবে জিজ্ঞাসা করেছি তার উত্তর দিয়েছি।
নেট নাগরিক

80

জাজানো ডক্স থেকে:

অন্তর্ভুক্ত ট্যাগটি "এই সাবটেম্পলেটটি সরবরাহ করুন এবং এইচটিএমএলকে অন্তর্ভুক্ত করুন" এর বাস্তবায়ন হিসাবে বিবেচনা করা উচিত, "এই সাবটেমলেটটি পার্স করা এবং এটির মূল বিষয়বস্তুর অংশ হিসাবে এটির বিষয়বস্তু অন্তর্ভুক্ত করা উচিত নয়"। এর অর্থ হ'ল অন্তর্ভুক্ত টেম্পলেটগুলির মধ্যে ভাগ করার কোনও রাজ্য নেই - প্রতিটি অন্তর্ভুক্ত হ'ল সম্পূর্ণ স্বতন্ত্র রেন্ডারিং প্রক্রিয়া।

সুতরাং জাজানো আপনার কমন্ডাটা এইচটিএমএল থেকে কোনও ব্লক ধরেনি এবং ব্লকের বাইরে রেন্ডার করা এইচটিএমএল দিয়ে কী করবে তা জানে না।


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

এটি ভবিষ্যতের লোকদের সহায়তা করার ক্ষেত্রে কেন এটি আমার জন্য কাজ করছে না সে সম্পর্কে আরও তথ্য:

এটি কাজ না করার কারণটি হ'ল জ্যাঙ্গোতে {%%% অন্তর্ভুক্ত থাকে অভিনব অ্যাডোস্ট্রোফের মতো বিশেষ চরিত্র পছন্দ করে না। আমি যে টেম্পলেট ডেটাটি অন্তর্ভুক্ত করার চেষ্টা করছিলাম সেটি শব্দ থেকে আটকানো হয়েছিল। আমাকে এই সমস্ত বিশেষ অক্ষরটি ম্যানুয়ালি মুছে ফেলতে হয়েছিল এবং তারপরে এটি সফলভাবে অন্তর্ভুক্ত হয়েছিল।


3

অভিভাবক টেম্পলেটটির ব্লকগুলিকে ওভাররাইড করতে আপনি কোনও অন্তর্ভুক্ত ফাইল থেকে শিশু টেম্পলেটটিতে ব্লকগুলি টানতে পারবেন না। যাইহোক, আপনি একটি চলক মধ্যে একটি পিতামাতার নির্দিষ্ট করতে পারেন এবং প্রসঙ্গে নির্দিষ্ট টেমপ্লেট নির্দিষ্ট করতে পারেন।

ডকুমেন্টেশন থেকে :

{% পরিবর্তনশীল% extend প্রসারিত করে ভেরিয়েবলের মান ব্যবহার করে। যদি ভেরিয়েবল কোনও স্ট্রিংয়ের মূল্যায়ন করে, জাজানো সেই স্ট্রিংটিকে প্যারেন্ট টেম্পলেটটির নাম হিসাবে ব্যবহার করবে। যদি ভেরিয়েবল কোনও টেম্পলেট অবজেক্টের মূল্যায়ন করে, জ্যাঙ্গো সেই বস্তুকে প্যারেন্ট টেম্পলেট হিসাবে ব্যবহার করবে।

পৃথক "পেজ 1 এইচটিএমএল" এবং "পেজ 2 এইচটিএমএল" এর পরিবর্তে "কমন্ডাটা এইচটিএমএল" {% extends base_template %}এর শীর্ষে রাখুন। এবং তারপরে আপনার দৃষ্টিতে, base_template"বেস1 এইচটিএমটিএল" বা "বেস 2 এইচটিএমএল" হিসাবে সংজ্ঞায়িত করুন ।


2

গুগলের মাধ্যমে এটি খুঁজে পাওয়া ভবিষ্যতের লোকদের রেফারেন্সের জন্য যুক্ত করা হয়েছে: আপনি মেজানাইন লাইব্রেরি দ্বারা প্রদত্ত {% ওভারএকসেট%} ট্যাগটি এই জাতীয় ক্ষেত্রে দেখার জন্য চাইতে পারেন।


1

10 ই ডিসেম্বর 2015 সম্পাদনা করুন : মন্তব্যে উল্লিখিত হিসাবে, এসএসআই সংস্করণ 1.8 থেকে অবচয় করা হয়েছে। ডকুমেন্টেশন অনুযায়ী:

এই ট্যাগটি অবহেলা করা হয়েছে এবং জ্যাঙ্গো 1.10 এ সরানো হবে। পরিবর্তে অন্তর্ভুক্ত ট্যাগ ব্যবহার করুন।


আমার মতে, এই প্রশ্নের সঠিক (সর্বোত্তম) উত্তর হ'ল পডশুমোকের একটি , কারণ এটি উত্তরাধিকারের পাশাপাশি ব্যবহার করার সময় কেন আচরণের অন্তর্ভুক্ত তা ব্যাখ্যা করে।

যাইহোক, আমি কিছুটা বিস্মিত কেউ কিছু উল্লেখ করেন যে, ssi আইনজীবীরা জ্যাঙ্গো টেমপ্লেট সিস্টেম, যা বিশেষভাবে জন্য ডিজাইন করা হয়েছে দ্বারা উপলব্ধ ট্যাগ ইনলাইন এর একটি বহিস্থিত টুকরা সহ টেক্সট । এখানে, ইনলাইনটির অর্থ বাহ্যিক পাঠ্যটি ব্যাখ্যা করা, পার্স করা বা ইন্টারপোল্ট করা হবে না, কেবল কলিং টেম্পলেটটির ভিতরে "অনুলিপি করা" হবে।

দয়া করে, আরও বিশদ জন্য ডকুমেন্টেশন দেখুন (পৃষ্ঠার নীচের ডান অংশে নির্বাচক মধ্যে জাজানো আপনার উপযুক্ত সংস্করণ পরীক্ষা করে দেখুন)।

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
দ্রষ্টব্য, ১.৮ হিসাবে, এসএসআই অন্তর্ভুক্ত করার পক্ষে স্বীকৃত হয়েছে। https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#std:templatetag-incolve
টিম এস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.