Itu mungkin dan cukup sederhana.
Django hanya memperbolehkan satu argumen ke filter Anda, tetapi tidak ada alasan Anda tidak bisa meletakkan semua argumen Anda ke dalam satu string menggunakan koma untuk memisahkannya.
Jadi misalnya, jika Anda menginginkan filter yang memeriksa apakah variabel X ada dalam daftar [1,2,3,4] Anda akan menginginkan filter template yang terlihat seperti ini:
{% if X|is_in:"1,2,3,4" %}
Sekarang kami dapat membuat templatetag Anda seperti ini:
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)
Baris yang membuat arg_list adalah ekspresi generator yang membagi string args pada semua koma dan panggilan .strip () untuk menghapus spasi di depan dan di belakangnya.
Jika, misalnya, argumen ke-3 adalah int maka lakukan saja:
arg_list[2] = int(arg_list[2])
Atau jika semuanya int lakukan:
arg_list = [int(arg) for arg in args.split(',')]
EDIT: sekarang untuk secara khusus menjawab pertanyaan Anda dengan menggunakan kunci, pasangan nilai sebagai parameter, Anda dapat menggunakan kelas yang sama yang Django gunakan untuk mengurai string kueri dari URL, yang kemudian juga memiliki keuntungan menangani pengkodean karakter dengan benar sesuai dengan pengaturan Anda. .
Jadi, seperti string kueri, setiap parameter dipisahkan oleh '&':
{{ attr.name|replace:"cherche=_&remplacement= " }}
Kemudian fungsi ganti Anda sekarang akan terlihat seperti ini:
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
Anda dapat mempercepat ini dengan risiko melakukan beberapa penggantian yang salah:
qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))