Это возможно и достаточно просто.
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, представляет собой выражение генератора, которое разбивает строку args на все запятые и вызывает .strip() для удаления всех начальных и конечных пробелов.
Если, например, 3-й аргумент является int, просто выполните:
arg_list[2] = int(arg_list[2])
Или, если все они ints do:
arg_list = [int(arg) for arg in args.split(',')]
РЕДАКТИРОВАТЬ: теперь, чтобы конкретно ответить на ваш вопрос, используя пары ключ, значение в качестве параметров, вы можете использовать тот же класс, который Django использует для анализа строк запроса из URL-адресов, что также имеет преимущество правильной обработки кодировки символов в соответствии с вашими настройками.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',''))
08.01.2009
tag
илиsimple_tag
, что позволяет передавать несколько переменных, даже именованные переменные. 13.01.2015