मैं django टेम्पलेट में अपने कस्टम टेम्पलेट फ़िल्टर में कई तर्क कैसे जोड़ूं?


89

यहाँ मेरा कस्टम फ़िल्टर है:

from django import template

register = template.Library()

@register.filter
def replace(value, cherche, remplacement):
    return value.replace(cherche, remplacement)

और यहां वे तरीके हैं जो मैंने अपने टेम्पलेट फ़ाइल में इसका उपयोग करने की कोशिश की, जिसके परिणामस्वरूप त्रुटि हुई:

{{ attr.name|replace:"_"," " }}
{{ attr.name|replace:"_" " " }}
{{ attr.name|replace:"_":" " }}
{{ attr.name|replace:"cherche='_', remplacement=' '" }}

मैंने django के डॉक्स और पुस्तक में देखा लेकिन केवल एक ही तर्क का उपयोग करके उदाहरण पाया ... क्या यह संभव है?

जवाबों:


108

यह संभव और काफी सरल है।

Django केवल आपके फ़िल्टर के लिए एक तर्क की अनुमति देता है, लेकिन कोई कारण नहीं है कि आप उन्हें अलग करने के लिए अल्पविराम का उपयोग करके अपने सभी तर्क एक ही स्ट्रिंग में नहीं डाल सकते।

उदाहरण के लिए, यदि आप एक ऐसा फ़िल्टर चाहते हैं, जो यह जाँच करे कि क्या चर X सूची में है [1,2,3,4] तो आप एक टेम्पलेट फ़िल्टर चाहेंगे जो इस तरह दिखता है:

{% if X|is_in:"1,2,3,4" %}

अब हम आपका टेम्प्लेटेटैग इस तरह बना सकते हैं:

from django.template import Library

register = Library()

def is_in(var, args):
    if args is None:
        return False
    arg_list = [arg.strip() for arg in args.split(',')]
    return var in arg_list

register.filter(is_in)

वह लाइन जो arg_list बनाती है, एक जनरेटर अभिव्यक्ति है जो किसी भी अग्रणी और अनुगामी रिक्त स्थान को निकालने के लिए सभी कॉमा और कॉल .strip () पर args स्ट्रिंग को विभाजित करती है।

यदि, उदाहरण के लिए, 3 तर्क एक int है तो बस करें:

arg_list[2] = int(arg_list[2])

या अगर उनमें से सभी ints करते हैं:

arg_list = [int(arg) for arg in args.split(',')]

संपादित करें: अब विशेष रूप से पैरामीटर के रूप में कुंजी, मान जोड़े का उपयोग करके अपने प्रश्न का उत्तर दें, आप उसी श्रेणी का उपयोग कर सकते हैं जोओवरो यूआरएल के बाहर क्वेरी स्ट्रिंग को पार्स करने के लिए उपयोग करता है, जो तब आपके सेटिंग्स के अनुसार ठीक से वर्ण एन्कोडिंग को संभालने का लाभ है। ।

इसलिए, क्वेरी स्ट्रिंग के साथ, प्रत्येक पैरामीटर को 'और' द्वारा अलग किया जाता है:

{{ attr.name|replace:"cherche=_&remplacement= " }}

तब आपका बदला हुआ कार्य अब इस तरह दिखेगा:

from django import template
from django.http import QueryDict

register = template.Library()

@register.filter
def replace(value, args):
    qs = QueryDict(args)
    if qs.has_key('cherche') and qs.has_key('remplacement'):
        return value.replace(qs['cherche'], qs['remplacement'])
    else:
        return value

आप कुछ गलत प्रतिस्थापन करने के जोखिम में इसे तेज कर सकते हैं:

qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))

1
अगर इन के लिए मान चर में हैं तो इसे कैसे लागू किया जाए ...?
Anto

2
यह मददगार लग रहा था, लेकिन मैं इसे वैरिएबल के साथ काम नहीं कर पाया। ऐसा करने के लिए, मैं उपयोग एक था tagया simple_tagजो कई चर, यहां तक कि चर पारित होने के लिए नामित किया गया के लिए अनुमति देता है -।
फोबेनेटर

18

डॉक्स के इस खंड के अनुसार संभव नहीं है :

कस्टम फ़िल्टर केवल पायथन कार्य हैं जो एक या दो तर्क लेते हैं:

  • चर (इनपुट) का मूल्य - जरूरी नहीं कि एक स्ट्रिंग।
  • तर्क का मूल्य - इसका एक डिफ़ॉल्ट मान हो सकता है, या पूरी तरह से छोड़ दिया जा सकता है।

यदि आप हार्ड-कोडिंग स्ट्रिंग्स का उपयोग कर रहे हैं तो वैन गेल का दृष्टिकोण काम करेगा। Django टिकट [ code.djangoproject.com/ticket/1199] एक कस्टम फ़िल्टर में कई तर्कों का समर्थन करता है और एक पैच स्वीकार किया गया है।
जेफ बाउर

17

यह इस तरह आसान है।

@register.filter(name='one_more')
def one_more(_1, _2):
    return _1, _2

def your_filter(_1_2, _3)
    _1, _2 = _1_2
    print "now you have three arguments, enjoy"

{{ _1|one_more:_2|your_filter:_3 }}

इस समाधान के लिए वास्तव में बहुत धन्यवाद। मैंने इसे थोड़ा उन्नत किया है ताकि आप विभिन्न लंबाई के मापदंडों की श्रृंखला बना सकें। gist.github.com/BrnoPCmaniak/e9552294b3059461f940a47143f58811
Filip Dobrovolný

1
यह सही उत्तर होना चाहिए! यह एक सुंदर अजगर समाधान है (शायद सबसे अच्छा django समाधान नहीं, @dragonroot जवाब देखें)
एंटोनी ड्रैन

15

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


2
यह मेरे मुद्दे का सही जवाब था। इस फंक्शन में टेम्प्लेट वेरिएबल पास करने के लिए, मुझे एक का उपयोग करना था simple_tag
फ्यूरोबिनेटर

1
यह एक अच्छा उपाय है। यह निश्चित रूप से सरल टैग के लिए django डॉक्स की जाँच करने के लायक है: docs.djangoproject.com/en/1.8/howto/custom-template-tags/…
Gunther

5

यह आपके विचार से अधिक सरल है आप इसके लिए simple_tag का

उपयोग कर सकते हैं ।

@register.simple_tag
def multiple_args_tag(a, b, c, d):
   #do your stuff
   return 

टेम्पलेट में :

{% multiple_args_tag 'arg1' 'arg2' 'arg3' 'arg4' %}

नोट: सर्वर को फिर से चलाने के लिए मत भूलना।


4

इस विशेषता को 2013 के Django के Trac में WONTFIX के रूप में चिह्नित किया गया है: http://code.djangoproject.com/ticket/1199


उस टिकट को पिछले साल (2013) WONTFIX के रूप में बंद कर दिया गया था, उनके डेवलपर ने कई तर्कों की आवश्यकता होने पर एक कस्टम टैग का उपयोग करने का सुझाव दिया।
पॉल लो

3

<मेरी साइट> /globaltags/replace.py

from django.template import Library

import re

register = Library()

def search(value, search):
    return re.sub(search, '#f4x@SgXXmS', value)

def replace(value, replace):
    return re.sub('#f4x@SgXXmS', replace, value)

register.filter(search)
register.filter(replace)

टेम्पलेट में:

{{ "saniel"|search:"s"|replace:"d" }}

अच्छा होगा यदि आपने #f4x@SgXXmSथोड़ा समझाया ?
दान अब्रामोव

1
प्लेसहोल्डर के रूप में उपयोग किया जाने वाला एक यादृच्छिक स्ट्रिंग। मैंने इस स्ट्रिंग को चुना है क्योंकि मेरा मानना ​​है कि यह इनपुट स्ट्रिंग का हिस्सा नहीं होगा। यदि उदाहरण के लिए मैंने "#} का प्रयोग किया है तो '# f4x @ SgXXmS' के बजाय {{" उपयोग {} को बंद करें [] "।": खोज "बंद" | प्रतिस्थापित करें: "का"}} वापस आएगा: "उपयोग" इसके बजाय [] "और अपेक्षित परिणाम नहीं:" का उपयोग करें {} के बजाय [] "
theosp

5
ओह, यह समझ में आता है। इसे जैसा घोषित किया जाए, अच्छा होगा SUBSTRING_THAT_NEVER_OCCURS
दान अब्रामोव

-1

आप बस यह कर सकते हैं:

{% assign find_total_issued = dailysalesreport | find: "TotalIssued":"13" %}

public static List<object> Find(object collection, string column, string value)

और यह गंतव्य तक पहुंच जाएगा क्योंकि फ़ंक्शन का अमूर्त है sjare


-2

एक बुरा विचार है, लेकिन काम करता है:

{{ xml|input_by_xpath:"{'type':'radio','xpath':'//result/value'}" }}

तथा

@register.filter
def input_by_xpath(device, args): 
    args = eval(args)
    ...
    result = "<input type=\"%s\" value=\"%s\" name=\"%s\"/>"%(args['type'],value,args['xpath'])
    return mark_safe(result)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.