Django टेम्प्लेट्स में स्ट्रिंग्स को कैसे बदलना है?


190

मैं एक Django टेम्पलेट टैग में एक स्ट्रिंग को बदलना चाहते हैं, जैसे:

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

यहाँ shop_nameमेरा वैरिएबल है और मैं इसे बाकी रास्तों से जोड़ना चाहता हूँ।

मान लो मेरे पास है shop_name=example.com और मैं परिणाम का विस्तार करना चाहता हूं shop/example.com/base.html

जवाबों:


380

साथ उपयोग:

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

2
मैं इस जवाब से पूरी तरह से भ्रमित था क्योंकि यह विस्तार टैग के बजाय शामिल टैग का उपयोग करता है, लेकिन जाहिर है यह सिर्फ काम करता है। हालांकि मैं अहसान के खुद के जवाब की सिफारिश करूंगा क्योंकि यह भी काम करता है और (मेरी राय में) शब्दार्थ अधिक सही है और कम भ्रम पैदा करता है।
गीताकार

15
यह काम कर सकता है लेकिन इसे django टेम्प्लेट्स में स्ट्रिंग्स को सामान्य करने के लिए एक सामान्य उत्तर के रूप में नहीं माना जाना चाहिए। देखें stackoverflow.com/a/23783666/781695
उपयोगकर्ता

जैसा कि Django के दस्तावेज में कहा गया है, "स्ट्रिंग्स जो पूर्णांकों के लिए ज़ब्त की जा सकती हैं, सम्‍मिलित की जाएंगी, न कि सम्‍मिलित", उदाहरण के लिए, यदि आप मॉडल ऑब्जेक्ट की प्राथमिक कुंजियों को सम्‍मिलित करना चाहते हैं (अद्वितीय यूनीक कुंजी बनाने के लिए उपयोगी हो सकता है), तो यह नहीं है काम।
zen11625

मुझे लगता है कि यह बिल्कुल नहीं बचता है shop_name, इसलिए यह खतरनाक है।
फ्लिम

ज्ञात हो, जैसा कि पहले ही उल्लेख किया गया है, यह केवल तार के साथ काम करता है! यदि आप shop_nameइसे किसी दृश्य में संदर्भ में पास करने से पहले get_context_dataअनुवाद करते हैं, तो सुनिश्चित करें कि इसका उपयोग ugettextकरने के बजाय इसका अनुवाद किया गया है ugettext_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)

और फिर इसे @Steven के रूप में उपयोग करें

{% load <appname>_extras %}

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

टालने का कारण add:

डॉक्स के अनुसार

यह फ़िल्टर पहले पूर्णांक के लिए दोनों मानों को मिलाने का प्रयास करेगा ... पूर्णांक के लिए बाध्य किए जाने वाले तार सम्‍मिलित किए जाएंगे, समाप्‍त नहीं ...

यदि दोनों चर पूर्णांक होते हैं, तो परिणाम अप्रत्याशित होगा।


क्या वह @ register.filter नहीं होना चाहिए (नाम = 'addstr')?
राजद्रोह

6
इसे सर्वोत्तम उत्तर के रूप में चिह्नित किया जाना चाहिए क्योंकि मानों के साथ सही ढंग से काम करना जो कि पूर्णांक के रूप में पायथन द्वारा किया जा सकता है।
zen11625

2
मुझे नहीं क्यों आप सबसे "ऊपर" के साथ एक नहीं हैं पता है, क्योंकि यह है आपके इस सवाल का जवाब है जो सही है, " add" अकेले बस का उपयोग नहीं करता str()पहली जगह में और काम नहीं किया था सब पर मेरे लिए अपने समाधान दोषरहित काम करता है, जबकि
ओलिवियर पोंस

1
आपके उत्तर ने मुझे बचा लिया है!
लजुबिसा लिवाक

6
अपने टेम्पलेट फ़ाइल के शीर्ष पर अपना कस्टम फ़िल्टर लोड करना याद रखें:{% load <appname>_extras %}
सुसैन पेंग

13

मैंने फ़ोल्डर पदानुक्रम को बदल दिया है

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

और फिर नीचे काम करेगा।

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

अब इसका आधार base.html पेज को बढ़ाने में सक्षम है।


7

Django टेम्प्लेट्स में सामंजस्यपूर्ण स्ट्रिंग्स का संदर्भ लें :

  1. Django के पुराने संस्करणों के लिए:

    {{ "Mary had a little"|stringformat:"s lamb." }}

"मेरी के पास एक छोटा मेमना था।"

  1. अन्य:

    {{ "Mary had a little"|add:" lamb." }}

"मेरी के पास एक छोटा मेमना था।"


3

फ़िल्टर पर एक नज़र हैadd

संपादित करें: आप श्रृंखला फ़िल्टर कर सकते हैं, ताकि आप कर सकें "shop/"|add:shop_name|add:"/base.html" । लेकिन यह काम नहीं करेगा क्योंकि यह तर्कों में फ़िल्टर का मूल्यांकन करने के लिए टेम्प्लेट टैग पर निर्भर है, और इसका विस्तार नहीं करता है।

मुझे लगता है कि आप इसे टेम्प्लेट के भीतर नहीं कर सकते।


यह काम करने वाला नहीं है। मैं पथ के बीच में अपना चर जोड़ना चाहता हूं।
अहसान

केवल django डॉक्स के अनुसार सम्‍मिलित न किए गए फ़िल्टर जोड़ें
अहसन

डॉक्स का कहना है कि "स्ट्रिंग्स को पूर्णांकों के लिए बाध्य किया जा सकता है"। अन्य तारों को समतल किया जाता है। लेकिन यह वास्तव में वैसे भी मायने नहीं रखता क्योंकि आप फ़िल्टर का उपयोग नहीं कर सकते हैं :(
डैनियल हेपर

2

डॉक्स से:

इस टैग का उपयोग दो तरीकों से किया जा सकता है:

  • {% extends "base.html" %} (कोट्स के साथ) शाब्दिक मान "base.html" का उपयोग करता है, जिसका विस्तार करने के लिए मूल टेम्पलेट का नाम है।
  • {% extends variable %}चर के मूल्य का उपयोग करता है। यदि चर स्ट्रिंग का मूल्यांकन करता है, तो Django उस स्ट्रिंग को मूल टेम्पलेट के नाम के रूप में उपयोग करेगा। यदि चर टेम्पलेट ऑब्जेक्ट पर मूल्यांकन करता है, तो Django उस ऑब्जेक्ट को मूल टेम्पलेट के रूप में उपयोग करेगा।

तो ऐसा लगता है कि आप तर्क में हेरफेर करने के लिए फ़िल्टर का उपयोग नहीं कर सकते। कॉलिंग दृश्य में आपको या तो पूर्वज टेम्पलेट को तत्काल करना होगा या सही पथ के साथ एक स्ट्रिंग चर बनाना होगा और इसे संदर्भ के साथ पास करना होगा।


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

आप django टेम्प्लेट में परिवर्तनशील हेरफेर नहीं कर सकते। आपके पास दो विकल्प हैं, या तो अपना टेम्प्लेट टैग लिखें या इसे ध्यान में रखते हुए,


मेरी आवश्यकता इसे केवल टेम्पलेट्स में करने की है ताकि दृश्य विकल्प मददगार न हो। मैंने कस्टम टेम्प्लेट टैग के माध्यम से भी प्रयास किया था, लेकिन {% विस्तार ....%} टैग के बाद {% लोड कॉनैट%} होना चाहिए। तो अब मैं इसे कैसे कर सकता हूं?
अहसान

एक विस्तारित_ टेक्स्ट टैग लिखें जो एक स्ट्रिंग प्रारूप और तर्कों को स्वीकार करता है।
बजे पाउलो स्कर्डीने

क्या आप मुझे डिफ़ॉल्ट लोगों के लिए कस्टम टैग लिखने का एक उदाहरण दे सकते हैं?
अहसान

0

extendsइसके लिए कोई सुविधा नहीं है। या तो संपूर्ण टेम्प्लेट पथ को एक संदर्भ चर में रखें और उसका उपयोग करें, या मौजूद टेम्प्लेट टैग को कॉपी करें और इसे उचित रूप से संशोधित करें।


उत्तर के लिए thanx! संदर्भ चर के लिए मुझे अपने प्रोजेक्ट की आवश्यकता के कारण view.py में सेट करना होगा जो कि मैं नहीं कर सकता। और कृपया दूसरे का उदाहरण दें।
अहसान

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 }}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.