É possível e bastante simples.
Django permite apenas um argumento para o seu filtro, mas não há razão para você não colocar todos os seus argumentos em uma única string usando uma vírgula para separá-los.
Então, por exemplo, se você quiser um filtro que verifique se a variável X está na lista [1,2,3,4], você vai querer um filtro de modelo semelhante a este:
{% if X|is_in:"1,2,3,4" %}
Agora podemos criar sua templatetag assim:
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)
A linha que cria arg_list é uma expressão geradora que divide a string args em todas as vírgulas e chama .strip () para remover todos os espaços à esquerda e à direita.
Se, por exemplo, o terceiro argumento for um int, basta fazer:
arg_list[2] = int(arg_list[2])
Ou se todos eles forem ints, faça:
arg_list = [int(arg) for arg in args.split(',')]
EDITAR: agora, para responder especificamente à sua pergunta usando pares de chave e valor como parâmetros, você pode usar a mesma classe que o Django usa para analisar strings de consulta de URL, que também tem o benefício de lidar com a codificação de caracteres adequadamente de acordo com suas configurações.py .
Portanto, como acontece com as strings de consulta, cada parâmetro é separado por '&':
{{ attr.name|replace:"cherche=_&remplacement= " }}
Em seguida, sua função de substituição ficará assim:
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
Você pode acelerar um pouco com o risco de fazer algumas substituições incorretas:
qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))
tag
ousimple_tag
- que permite a passagem de várias variáveis, até mesmo variáveis nomeadas.Não é possível de acordo com esta seção dos documentos:
Filtros personalizados são apenas funções Python que aceitam um ou dois argumentos:
fonte
É fácil assim.
@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 }}
fonte
Em vez de um filtro, registre sua tag como uma tag simples. Esses podem ter vários argumentos. A sintaxe para invocá-lo será um pouco diferente, mas isso é apenas uma mudança sintática.
fonte
simple_tag
.É mais simples do que você pensa.
Você pode usar simple_tag para isso.
@register.simple_tag def multiple_args_tag(a, b, c, d): #do your stuff return
No modelo :
{% multiple_args_tag 'arg1' 'arg2' 'arg3' 'arg4' %}
fonte
Este recurso foi marcado como WONTFIX em 2013 Django's Trac: http://code.djangoproject.com/ticket/1199
fonte
<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)
No modelo:
{{ "saniel"|search:"s"|replace:"d" }}
fonte
#f4x@SgXXmS
pouco?SUBSTRING_THAT_NEVER_OCCURS
pensamento.Você pode simplesmente fazer isso:
{% assign find_total_issued = dailysalesreport | find: "TotalIssued":"13" %} public static List<object> Find(object collection, string column, string value)
E chegará ao destino como a abstração da função
sjare
.fonte
É uma má ideia, mas funciona:
{{ xml|input_by_xpath:"{'type':'radio','xpath':'//result/value'}" }}
e
@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)
fonte