উত্তর:
সাথে ব্যবহার করো:
{% with "shop/"|add:shop_name|add:"/base.html" as template %}
{% include template %}
{% endwith %}
shop_name
যায় না, তাই এটি বিপজ্জনক।
shop_name
কোনও দৃশ্যে প্রসঙ্গে যাওয়ার আগে আপনি যদি এটি অনুবাদ করেন তবে এটির পরিবর্তে get_context_data
এটির অনুবাদ হয়েছে কিনা তা নিশ্চিত করুন । ugettext
ugettext_lazy
add
স্ট্রিংয়ের জন্য ব্যবহার করবেন না , আপনার পছন্দসই ট্যাগটির মতো সংজ্ঞা দেওয়া উচিত:
একটি ফাইল তৈরি করুন: <appname>\templatetags\<appname>_extras.py
from django import template
register = template.Library()
@register.filter
def addstr(arg1, arg2):
"""concatenate arg1 & arg2"""
return str(arg1) + str(arg2)
এবং তারপরে এটি @ স্টিভেনের কথা মতো ব্যবহার করুন
{% load <appname>_extras %}
{% with "shop/"|addstr:shop_name|addstr:"/base.html" as template %}
{% include template %}
{% endwith %}
এড়িয়ে যাওয়ার কারণ add
:
ডক্স অনুসারে
এই ফিল্টারটি প্রথমে উভয় মানকে পূর্ণসংখ্যার দিকে চাপিয়ে দেওয়ার চেষ্টা করবে ... যে স্ট্রিংগুলি পূর্ণসংখ্যার সাথে জোর করা যায় সেগুলি সংক্ষিপ্ত করা হবে, সংক্ষেপিত নয় ...
যদি উভয় ভেরিয়েবলগুলি পূর্ণসংখ্যার হয়ে থাকে তবে ফলাফলটি অপ্রত্যাশিত হবে।
add
" একা শুধু ব্যবহার করে না str()
প্রথম স্থানে এবং কাজ করে নি এ সব আমার জন্য আপনার সমাধান flawlessly কাজ করে যেহেতু
{% load <appname>_extras %}
পড়ুন জ্যাঙ্গো টেমপ্লেটে concatenating স্ট্রিংস :
জ্যাঙ্গোর আগের সংস্করণগুলির জন্য:
{{ "Mary had a little"|stringformat:"s lamb." }}
"মেরি একটি লিটল ল্যাম্ব ছিল."
অন্য:
{{ "Mary had a little"|add:" lamb." }}
"মেরি একটি লিটল ল্যাম্ব ছিল."
কটাক্ষপাত আছে add
ফিল্টার ।
সম্পাদনা: আপনি ফিল্টারগুলি চেইন করতে পারেন, তাই আপনি করতে পারেন "shop/"|add:shop_name|add:"/base.html"
। তবে এটি কাজ করবে না কারণ তর্কগুলিতে ফিল্টারগুলি মূল্যায়ন করার জন্য এটি টেম্পলেট ট্যাগের উপর নির্ভর করে এবং প্রসারিত হয় না।
আমার ধারণা আপনি টেম্পলেটগুলির মধ্যে এটি করতে পারবেন না।
ডক্স থেকে:
এই ট্যাগটি দুটি উপায়ে ব্যবহার করা যেতে পারে:
{% extends "base.html" %}
(উদ্ধৃতি সহ) আক্ষরিক মান "base.html" ব্যাবহারের জন্য প্যারেন্ট টেম্পলেটটির নাম হিসাবে ব্যবহার করে।{% extends variable %}
ভেরিয়েবলের মান ব্যবহার করে। যদি ভেরিয়েবল একটি স্ট্রিংয়ের মূল্যায়ন করে, জাজানো সেই স্ট্রিংটিকে প্যারেন্ট টেম্পলেটটির নাম হিসাবে ব্যবহার করবে। যদি ভেরিয়েবল কোনও টেম্পলেট অবজেক্টের মূল্যায়ন করে তবে জ্যাঙ্গো সেই বস্তুকে প্যারেন্ট টেম্পলেট হিসাবে ব্যবহার করবে।সুতরাং মনে হচ্ছে আপনি যুক্তিটি পরিচালনা করতে কোনও ফিল্টার ব্যবহার করতে পারবেন না। কলিং ভিউতে আপনাকে হয় পূর্বপুরুষের টেমপ্লেটটি ইনস্ট্যান্ট করতে হবে বা সঠিক পথ দিয়ে একটি স্ট্রিং ভেরিয়েবল তৈরি করতে হবে এবং প্রসঙ্গের সাথে এটি পাস করতে হবে।
@ ত্রুটির উত্তরটি মূলত সঠিক, আপনার এটির জন্য একটি টেমপ্লেট ট্যাগ ব্যবহার করা উচিত। তবে আমি কিছুটা জেনেরিক টেম্পলেট ট্যাগটি পছন্দ করি যা আমি এর মতো কোনও ধরণের ক্রিয়াকলাপ সম্পাদন করতে ব্যবহার করতে পারি:
from django import template
register = template.Library()
@register.tag(name='captureas')
def do_captureas(parser, token):
"""
Capture content for re-use throughout a template.
particularly handy for use within social meta fields
that are virtually identical.
"""
try:
tag_name, args = token.contents.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError("'captureas' node requires a variable name.")
nodelist = parser.parse(('endcaptureas',))
parser.delete_first_token()
return CaptureasNode(nodelist, args)
class CaptureasNode(template.Node):
def __init__(self, nodelist, varname):
self.nodelist = nodelist
self.varname = varname
def render(self, context):
output = self.nodelist.render(context)
context[self.varname] = output
return ''
এবং তারপরে আপনি এটি আপনার টেম্পলেটে এটি ব্যবহার করতে পারেন:
{% captureas template %}shop/{{ shop_name }}/base.html{% endcaptureas %}
{% include template %}
মন্তব্যে যেমন উল্লেখ করা হয়েছে, এই টেমপ্লেট ট্যাগটি বিশেষভাবে সেই তথ্যের জন্য দরকারী যা কোনও টেমপ্লেট জুড়ে পুনরাবৃত্তিযোগ্য তবে যুক্তি এবং অন্যান্য জিনিসগুলির প্রয়োজন যা আপনার টেমপ্লেটগুলিকে জাগিয়ে তুলবে, বা এমন পরিস্থিতিতে যেখানে আপনি ব্লকগুলির মাধ্যমে টেমপ্লেটগুলির মধ্যে পাস করা ডেটা পুনরায় ব্যবহার করতে চান:
{% captureas meta_title %}{% spaceless %}{% block meta_title %}
{% if self.title %}{{ self.title }}{% endif %}
{% endblock %}{% endspaceless %} - DEFAULT WEBSITE NAME
{% endcaptureas %}
এবং তারপর:
<title>{{ meta_title }}</title>
<meta property="og:title" content="{{ meta_title }}" />
<meta itemprop="name" content="{{ meta_title }}">
<meta name="twitter:title" content="{{ meta_title }}">
ক্যাপচারাস ট্যাগের জন্য ক্রেডিট এখানে দেই: https://www.djangosnippets.org/snippets/545/
আমি {% with %}
ট্যাগ সঙ্গে কাজ করতে বেশ ঝামেলা হতে পারে। পরিবর্তে আমি নিম্নলিখিত টেমপ্লেট ট্যাগ তৈরি করেছি, যা স্ট্রিং এবং পূর্ণসংখ্যার উপর কাজ করা উচিত।
from django import template
register = template.Library()
@register.filter
def concat_string(value_1, value_2):
return str(value_1) + str(value_2)
তারপরে নিম্নলিখিতটি ব্যবহার করে আপনার টেমপ্লেটে টেম্পলেট ট্যাগটি শীর্ষে লোড করুন:
{% load concat_string %}
তারপরে আপনি এটি নিম্নলিখিত উপায়ে ব্যবহার করতে পারেন:
<a href="{{ SOME_DETAIL_URL|concat_string:object.pk }}" target="_blank">123</a>
আমি ব্যক্তিগতভাবে এটির সাথে কাজ করার জন্য এটি বেশ পরিচ্ছন্ন হতে পেরেছি।
জাজানো টেম্পলেটগুলিতে আপনি পরিবর্তনশীল হেরফের করতে পারবেন না। আপনার দুটি বিকল্প রয়েছে, হয় নিজের টেম্পলেট ট্যাগ লিখুন বা দেখুন এইভাবে করুন,
extends
এই জন্য কোন সুবিধা আছে। হয় পুরো টেম্পলেট পাথটি একটি প্রসঙ্গে পরিবর্তনশীলের মধ্যে রাখুন এবং এটি ব্যবহার করুন বা বিদ্যমান টেমপ্লেট ট্যাগটি অনুলিপি করুন এবং এটিকে যথাযথভাবে সংশোধন করুন।