জ্যাঙ্গো টেম্পলেটগুলিতে স্ট্রিংগুলি কীভাবে সংযুক্ত করতে হয়?


189

আমি জ্যাঙ্গো টেমপ্লেট ট্যাগটিতে একটি স্ট্রিং সংযুক্ত করতে চাই, যেমন:

{% extend shop/shop_name/base.html %}

এখানে shop_nameআমার পরিবর্তনশীল এবং আমি এটিকে বাকী পথ দিয়ে বোঝাতে চাই।

ধরুন আমার আছে shop_name=example.comএবং আমি ফলাফলটি প্রসারিত করতে চাই shop/example.com/base.html

উত্তর:


379

সাথে ব্যবহার করো:

{% with "shop/"|add:shop_name|add:"/base.html" as template %}
{% include template %}
{% endwith %}

2
আমি এই উত্তরটি দ্বারা সম্পূর্ণ বিভ্রান্ত হয়েছি কারণ এটি প্রসারিত ট্যাগের পরিবর্তে অন্তর্ভুক্ত ট্যাগটি ব্যবহার করে, তবে দৃশ্যত এটি ঠিক কাজ করে। যদিও আমি আহসানের নিজস্ব উত্তরটি সুপারিশ করব কারণ এটি কাজ করে এবং (আমার মতে) শব্দার্থগতভাবে আরও সঠিক এবং কম বিভ্রান্তি সৃষ্টি করে।
গীতারিক

15
এটি কাজ করতে পারে তবে জ্যাঙ্গো টেমপ্লেটগুলিতে স্ট্রিং সংযুক্ত করার সাধারণ উত্তর হিসাবে বিবেচনা করা উচিত নয়। দেখুন stackoverflow.com/a/23783666/781695
ব্যবহারকারী

জাজানো ডকুমেন্টেশনের প্রবাদ হিসাবে, "স্ট্রিংগুলিকে সংখ্যায় জোর করা যেতে পারে, সংক্ষিপ্ত করা হবে না" সুতরাং, উদাহরণস্বরূপ, আপনি যদি মডেল অবজেক্টের প্রাথমিক কীগুলি (অনন্য ক্যাশে কী তৈরির জন্য দরকারী হতে পারে) সংশ্লেষ করতে চান তবে তা হয় না হবে।
zen11625

আমি মনে করি এটি এড়ানো shop_nameযায় না, তাই এটি বিপজ্জনক।
ফ্লিম

ইতিমধ্যে উল্লিখিত হিসাবে সচেতন থাকুন, এটি কেবল স্ট্রিংগুলির সাথেই কাজ করে! shop_nameকোনও দৃশ্যে প্রসঙ্গে যাওয়ার আগে আপনি যদি এটি অনুবাদ করেন তবে এটির পরিবর্তে get_context_dataএটির অনুবাদ হয়েছে কিনা তা নিশ্চিত করুন । ugettextugettext_lazy
কিম

111

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:

ডক্স অনুসারে

এই ফিল্টারটি প্রথমে উভয় মানকে পূর্ণসংখ্যার দিকে চাপিয়ে দেওয়ার চেষ্টা করবে ... যে স্ট্রিংগুলি পূর্ণসংখ্যার সাথে জোর করা যায় সেগুলি সংক্ষিপ্ত করা হবে, সংক্ষেপিত নয় ...

যদি উভয় ভেরিয়েবলগুলি পূর্ণসংখ্যার হয়ে থাকে তবে ফলাফলটি অপ্রত্যাশিত হবে।


এটি কি @ রেজিস্টার.ফিল্টার (নাম = 'অ্যাডস্টার') হওয়া উচিত নয়?
উপমা

6
এটি সেরা উত্তর হিসাবে চিহ্নিত করা উচিত কারণ পাইথন দ্বারা পূর্ণসংখ্যা হিসাবে জোর করা যেতে পারে এমন মানগুলির সাথে সঠিকভাবে কাজ করা।
zen11625

2
আমি কেন আপনি সবচেয়ে "আপ" সঙ্গে এক নয় জানি কারণ এটা আপনার উত্তর যা সঠিক, " add" একা শুধু ব্যবহার করে না str()প্রথম স্থানে এবং কাজ করে নি এ সব আমার জন্য আপনার সমাধান flawlessly কাজ করে যেহেতু
অলিভিয়ার পন্স

1
আপনার উত্তর আমাকে বাঁচিয়েছে!
লিজুবিসা লিভাক

6
আপনার টেম্পলেট ফাইলের শীর্ষে আপনার কাস্টম ফিল্টারটি লোড করতে ভুলবেন না:{% load <appname>_extras %}
সুসান পেং

13

আমি ফোল্ডার স্তরক্রম পরিবর্তন করেছি

/shop/shop_name/base.html To /shop_name/shop/base.html

এবং তারপরে নীচে কাজ করবে।

{% extends shop_name|add:"/shop/base.html"%} 

এখন এটি বেস html পৃষ্ঠাটি প্রসারিত করতে সক্ষম।



3

কটাক্ষপাত আছে addফিল্টার

সম্পাদনা: আপনি ফিল্টারগুলি চেইন করতে পারেন, তাই আপনি করতে পারেন "shop/"|add:shop_name|add:"/base.html"। তবে এটি কাজ করবে না কারণ তর্কগুলিতে ফিল্টারগুলি মূল্যায়ন করার জন্য এটি টেম্পলেট ট্যাগের উপর নির্ভর করে এবং প্রসারিত হয় না।

আমার ধারণা আপনি টেম্পলেটগুলির মধ্যে এটি করতে পারবেন না।


এটি কাজ করে না। আমি আমার চলকের মাঝখানে যোগ করতে চাই।
আহসান

ফিল্টার যুক্ত করুন কেবলমাত্র জ্যাঙ্গো ডক্স অনুসারে সংশ্লেষিত নয়
আহসান

দস্তাবেজগুলি বলছে "সংখ্যার সাথে জোর করা যায় এমন স্ট্রিংগুলি সংক্ষিপ্ত করা হবে"। অন্যান্য স্ট্রিং সংমিশ্রিত হয়। তবে এটি যাইহোক সত্যিই
তাত্পর্যপূর্ণ

2

ডক্স থেকে:

এই ট্যাগটি দুটি উপায়ে ব্যবহার করা যেতে পারে:

  • {% extends "base.html" %} (উদ্ধৃতি সহ) আক্ষরিক মান "base.html" ব্যাবহারের জন্য প্যারেন্ট টেম্পলেটটির নাম হিসাবে ব্যবহার করে।
  • {% extends variable %}ভেরিয়েবলের মান ব্যবহার করে। যদি ভেরিয়েবল একটি স্ট্রিংয়ের মূল্যায়ন করে, জাজানো সেই স্ট্রিংটিকে প্যারেন্ট টেম্পলেটটির নাম হিসাবে ব্যবহার করবে। যদি ভেরিয়েবল কোনও টেম্পলেট অবজেক্টের মূল্যায়ন করে তবে জ্যাঙ্গো সেই বস্তুকে প্যারেন্ট টেম্পলেট হিসাবে ব্যবহার করবে।

সুতরাং মনে হচ্ছে আপনি যুক্তিটি পরিচালনা করতে কোনও ফিল্টার ব্যবহার করতে পারবেন না। কলিং ভিউতে আপনাকে হয় পূর্বপুরুষের টেমপ্লেটটি ইনস্ট্যান্ট করতে হবে বা সঠিক পথ দিয়ে একটি স্ট্রিং ভেরিয়েবল তৈরি করতে হবে এবং প্রসঙ্গের সাথে এটি পাস করতে হবে।


1

@ ত্রুটির উত্তরটি মূলত সঠিক, আপনার এটির জন্য একটি টেমপ্লেট ট্যাগ ব্যবহার করা উচিত। তবে আমি কিছুটা জেনেরিক টেম্পলেট ট্যাগটি পছন্দ করি যা আমি এর মতো কোনও ধরণের ক্রিয়াকলাপ সম্পাদন করতে ব্যবহার করতে পারি:

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/


1

আমি {% 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>

আমি ব্যক্তিগতভাবে এটির সাথে কাজ করার জন্য এটি বেশ পরিচ্ছন্ন হতে পেরেছি।


0

জাজানো টেম্পলেটগুলিতে আপনি পরিবর্তনশীল হেরফের করতে পারবেন না। আপনার দুটি বিকল্প রয়েছে, হয় নিজের টেম্পলেট ট্যাগ লিখুন বা দেখুন এইভাবে করুন,


আমার প্রয়োজনীয়তাটি কেবলমাত্র টেমপ্লেটগুলিতেই করা হয় যাতে দেখার বিকল্পটি সহায়ক না হয়। আমি কাস্টম টেম্পলেট ট্যাগের মাধ্যমেও চেষ্টা করেছি কিন্তু extend% বাড়ানোর পরে% load% লোড কনক্যাট%} করা উচিত ....%} ট্যাগ। তাহলে আমি এখন এটি কিভাবে করতে পারি?
আহসান

স্ট্রিং ফর্ম্যাট এবং আর্গুমেন্ট গ্রহণ করে এমন একটি এক্সটেন্ডেড_ এক্সটেন্ডস ট্যাগ লিখুন।
পাওলো স্কার্ডাইন

আপনি কি দয়া করে আমাকে ডিফল্টর জন্য কাস্টম ট্যাগ লেখার একটি উদাহরণ দিতে পারেন?
আহসান

0

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


উত্তরের জন্য ধন্যবাদ! প্রসঙ্গের ভেরিয়েবলের জন্য আমাকে ভিউ.পিতে সেট করতে হবে যা আমার প্রকল্পের প্রয়োজনীয়তার কারণে আমি ক্যান না। এবং দয়া করে দ্বিতীয়টির উদাহরণ দিন।
আহসান

0

এবং একাধিক মনঃ

from django import template
register = template.Library()


@register.simple_tag
def concat_all(*args):
    """concatenate all args"""
    return ''.join(map(str, args))

এবং টেমপ্লেটে:

{% concat_all 'x' 'y' another_var as string_result %}
concatenated string: {{ string_result }}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.