Це можливо і досить просто.
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 (), щоб видалити пробіли, що ведуть і закінчують.
Якщо, наприклад, 3-й аргумент є int, тоді просто виконайте:
arg_list[2] = int(arg_list[2])
Або якщо всі вони є ints роблять:
arg_list = [int(arg) for arg in args.split(',')]
РЕДАГУВАТИ: тепер, щоб конкретно відповісти на ваше запитання, використовуючи параметри ключів, значень як параметри, ви можете використовувати той самий клас, який використовує Django для синтаксичного аналізу рядків запитів з URL-адрес, що також має перевагу належної обробки кодування символів відповідно до ваших settings.py .
Отже, як і в рядках запитів, кожен параметр відокремлюється символом '&':
{{ 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',''))