আমি কীভাবে একটি জাঙ্গো টেমপ্লেটে আমার কাস্টম টেম্পলেট ফিল্টারটিতে একাধিক যুক্তি যুক্ত করব?


91

আমার কাস্টম ফিল্টারটি এখানে:

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=' '" }}

আমি জাঙ্গোর ডক্স এবং বইটি সন্ধান করেছি কিন্তু কেবল একটি যুক্তি ব্যবহার করে উদাহরণ পেয়েছি ... এটি কি সম্ভব?

উত্তর:


108

এটি সম্ভব এবং মোটামুটি সহজ।

জ্যাঙ্গো কেবলমাত্র আপনার ফিল্টারে একটি যুক্তিকে মঞ্জুরি দেয়, তবে কোনও কারণ নেই যে আপনি আপনার সমস্ত যুক্তিগুলিকে আলাদা করতে কমা ব্যবহার করে একটি স্ট্রিংয়ে রাখতে পারবেন না।

সুতরাং উদাহরণস্বরূপ, আপনি যদি এমন একটি ফিল্টার চান যা ভেরিয়েবল এক্স তালিকায় রয়েছে কিনা তা পরীক্ষা করে [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)

লাইনটি আরগ_লিস্ট তৈরি করে এমন একটি জেনারেটর এক্সপ্রেশন যা আর্গুমেন্ট স্ট্রিংটি সমস্ত কমাতে বিভক্ত করে এবং যে কোনও নেতৃস্থানীয় এবং অনুসরণযোগ্য স্থানগুলি সরাতে .strip () কল করে।

যদি, উদাহরণস্বরূপ, 3 য় আর্গুমেন্ট একটি অন্তর্গত হয় তবে ঠিক করুন:

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

বা যদি তাদের সমস্তগুলি অন্তর্নিহিত হয়:

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',''))

4
যদি এর জন্য মানগুলি পরিবর্তনশীল হয় তবে এটি কীভাবে প্রয়োগ করা যায় ...?
Anto

4
এটি সহায়ক বলে মনে হয়েছিল, তবে আমি ভেরিয়েবলগুলি পাস করার সাথে এটি কাজ করতে পারি না। এটি করতে, আমি একটি tagবা simple_tag- ব্যবহার করেছি যা একাধিক ভেরিয়েবল, এমনকি নামযুক্ত ভেরিয়েবলগুলি পাস করার অনুমতি দেয়।
ফুরবিনেটর

18

দস্তাবেজের এই বিভাগ অনুসারে সম্ভব নয় :

কাস্টম ফিল্টারগুলি কেবল পাইথন ফাংশন যা এক বা দুটি আর্গুমেন্ট নেয়:

  • ভেরিয়েবলের মান (ইনপুট) - কোনও স্ট্রিং নয়।
  • আর্গুমেন্টের মান - এর একটি ডিফল্ট মান থাকতে পারে বা পুরোপুরি ছেড়ে যেতে পারে।

আপনি হার্ড-কোডড স্ট্রিং ব্যবহার করছেন তবে ভ্যান গালের পদ্ধতির কাজ হবে। জ্যাঙ্গোর টিকিট [কোড. djangoproject.com/ticket/1199] একটি কাস্টম ফিল্টারে একাধিক যুক্তি সমর্থন করে এবং একটি প্যাচ গ্রহণ করা হয়েছে।
জেফ বাউর 16 ই

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
ফিলিপ

4
এটি সঠিক উত্তর হওয়া উচিত! এটি একটি অজগর সমাধান (সম্ভবত সেরা জ্যাঙ্গো সমাধান নয়, @ ড্রাগনরুটের উত্তর দেখুন)
এন্টোইন ড্রইউন

15

ফিল্টারের পরিবর্তে, আপনার ট্যাগটিকে একটি সহজ ট্যাগ হিসাবে নিবন্ধন করুন। যারা একাধিক যুক্তি নিতে পারে। এটি চাওয়ার জন্য সিনট্যাক্সটি কিছুটা আলাদা হবে তবে এটি কেবল সিনট্যাকটিক চিনির পরিবর্তিত।


4
এটি আমার ইস্যুর সঠিক উত্তর ছিল। এই ফাংশনে কোনও টেম্পলেট ভেরিয়েবলটি পাস করার জন্য, আমাকে একটি ব্যবহার করতে হয়েছিল simple_tag
ফুরবিনেটর

4
এটি একটি ভাল সমাধান। সহজ ট্যাগটির জন্য জ্যাঙ্গো ডক্সটি
গুন্থার

6



আপনি এটির জন্য সহজ_ত্যাগ ব্যবহার করতে পারেন বলে মনে করেন এটি আরও সহজ

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

টেমপ্লেটে :

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

দ্রষ্টব্য: সার্ভারটি আবার চালাতে ভুলবেন না।


4

এই বৈশিষ্ট্যটি 2013 জঙ্গোর ট্র্যাককে ডাব্লুউন্টিক্স হিসাবে চিহ্নিত করা হয়েছে: http://code.djangoproject.com/ticket/1199


এই টিকিটটি গত বছর ডাব্লুউন্টিক্স হিসাবে বন্ধ ছিল (2013), তাদের বিকাশকারী একাধিক যুক্তি প্রয়োজন হলে একটি কাস্টম ট্যাগ ব্যবহার করার পরামর্শ দেয়।
পল লো

3

<my-Site> / 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কিছুটা বুঝিয়ে বললে কি ভালো লাগবে ?
ড্যান আব্রামভ

4
স্থানধারক হিসাবে ব্যবহৃত কেবল একটি এলোমেলো স্ট্রিং। আমি এই স্ট্রিংটি বেছে নিয়েছি কারণ আমি বিশ্বাস করি এটি ইনপুট স্ট্রিংয়ের অংশ হবে না। উদাহরণস্বরূপ যদি আমি '# f4x @ SgXXmS' এর পরিবর্তে "{}" ব্যবহার করেছি তবে [] "| অনুসন্ধান:" বন্ধ "| প্রতিস্থাপন:" "}} এর" ফিরে আসবে: "ব্যবহার [] "এর পরিবর্তে এবং প্রত্যাশিত ফলাফলটি নয়:" [] এর পরিবর্তে {use ব্যবহার করুন "
ধর্মশাস্ত্র

6
ওহ, এটা বোঝা যায়। এটিকে 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.