Это возможно и довольно просто.
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 () для удаления начальных и конечных пробелов.
Если, например, третий аргумент - это int, просто выполните:
arg_list[2] = int(arg_list[2])
Или, если все они целые, сделайте:
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',''))
tag
илиsimple_tag
-, который позволяет передавать несколько переменных, даже именованные переменные.Невозможно в соответствии с этим разделом документов:
Пользовательские фильтры - это просто функции Python, которые принимают один или два аргумента:
источник
Это просто.
@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 }}
источник
Вместо фильтра зарегистрируйте свой тег как простой тег. Они могут принимать несколько аргументов. Синтаксис для его вызова будет немного другим, но это просто синтаксическое изменение сахара.
источник
simple_tag
.Это проще, чем вы думаете. Для этого
можно использовать simple_tag .
@register.simple_tag def multiple_args_tag(a, b, c, d): #do your stuff return
В шаблоне :
{% multiple_args_tag 'arg1' 'arg2' 'arg3' 'arg4' %}
источник
Эта функция была отмечена как WONTFIX в Django Trac 2013 года: http://code.djangoproject.com/ticket/1199
источник
<мой-сайт> /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
немного объяснили ?SUBSTRING_THAT_NEVER_OCCURS
мысли.Вы можете просто сделать это:
{% assign find_total_issued = dailysalesreport | find: "TotalIssued":"13" %} public static List<object> Find(object collection, string column, string value)
И он достигнет места назначения как абстракция функции
sjare
.источник
Это плохая идея, но работает:
{{ 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)
источник