Come posso aggiungere più argomenti a mio template personalizzato filtro in django modello?

Ecco il mio filtro personalizzato:

from django import template

register = template.Library()

@register.filter
def replace(value, cherche, remplacement):
    return value.replace(cherche, remplacement)

e qui sono i modi ho provato ad usare il mio file di modello, che ha generato un errore:

{{ attr.name|replace:"_"," " }}
{{ attr.name|replace:"_" " " }}
{{ attr.name|replace:"_":" " }}
{{ attr.name|replace:"cherche='_', remplacement=' '" }}

Ho guardato in django docs e prenota, ma solo trovato esempio di utilizzo di un unico argomento… è ancora possibile?

InformationsquelleAutor bchhun | 2009-01-07



8 Replies
  1. 97

    È possibile e abbastanza semplice.

    Django consente un solo argomento per il filtro, ma non c’è ragione per cui non potete mettere tutte le vostre argomentazioni in una singola stringa utilizzando una virgola per separare i loro.

    Così, per esempio, se si desidera un filtro che controlla se la variabile X è nell’elenco [1,2,3,4] si vuole un filtro modello che assomiglia a questo:

    {% if X|is_in:"1,2,3,4" %}

    Ora siamo in grado di creare il tag come questo:

    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)

    La linea che crea arg_list è un generatore di espressione che divide la string args su tutte le virgole e le chiamate .strip() per rimuovere eventuali spazi iniziali e finali.

    Se, per esempio, il 3 ° argomento è un int, quindi basta fare:

    arg_list[2] = int(arg_list[2])

    O se tutti sono ints fare:

    arg_list = [int(arg) for arg in args.split(',')]

    EDIT: ora specificamente per rispondere alla tua domanda, utilizzando la chiave,coppie di valori come parametri, è possibile utilizzare la stessa classe di Django viene utilizzato per analizzare le stringhe di query di URL, che poi ha anche il vantaggio di gestire la codifica di caratteri correttamente, secondo l’settings.py.

    Così, come con stringhe di query, ogni parametro è separato da ‘&’:

    {{ attr.name|replace:"cherche=_&remplacement= " }}

    Quindi la tua funzione sarà come questo:

    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

    Si potrebbe accelerare alcune a rischio di fare alcune sostituzioni errate:

    qs = QueryDict(args)
    return value.replace(qs.get('cherche',''), qs.get('remplacement',''))
    • la prima parte era esattamente quello che ho fatto! grazie comunque!
    • Seil valori sono variabili come implementare questo…?
    • Questo sembrava utile, ma non riuscivo a farlo funzionare con il passaggio di variabili. Per farlo, ho dovuto utilizzare un tag o simple_tag – che permette una molteplicità di variabili, anche denominato variabili per essere passato.
  2. 17

    Non sia possibile, secondo in questa sezione dei documenti:

    Filtri personalizzati, sono solo le funzioni in Python che prendere uno o due argomenti:

    • Il valore della variabile (input) —
      non necessariamente una stringa.
    • Il valore di un argomento — questo può avere un
      valore di default, o essere lasciato fuori tutto.
  3. 10

    Invece di un filtro, per registrare il tuo tag, come un semplice tag. Questi possono prendere più argomenti. La sintassi per richiamare sarà un po ‘diversa, ma solo” zucchero sintattico cambiando.

    • Questa è stata la risposta corretta per il mio problema. Per passare una variabile di modello in questa funzione, ho dovuto usare un simple_tag.
    • Questa è una buona soluzione. E ‘ sicuramente la pena di verificare il django documenti per il semplice tag: docs.djangoproject.com/en/1.8/howto/custom-template-tags/…
  4. 9

    È facile come questo.

    @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 }}
  5. 2

    <il mio sito>/globaltags/replace.py

    from django.template import Library
    
    import re
    
    register = Library()
    
    def search(value, search):
        return re.sub(search, '#[email protected]', value)
    
    def replace(value, replace):
        return re.sub('#[email protected]', replace, value)
    
    register.filter(search)
    register.filter(replace)

    Nel modello:

    {{ "saniel"|search:"s"|replace:"d" }}
    • Sarebbe bello se si ha spiegato #[email protected] po’?
    • solo una stringa casuale utilizzato come segnaposto. Ho scelto questa stringa, perché ho creduto di non essere parte della stringa di input. Se per esempio ho usato “{}” al posto di “#[email protected]’ {{ “utilizzare {} invece no []”|search:”off”|sostituire:”del” }} vorresti ritornare: “uso al posto di []” e non il risultato atteso: “utilizzare {} invece di []”
    • Oh, che rende il senso. Potrebbe essere interessante per dichiarare come SUBSTRING_THAT_NEVER_OCCURS pensiero.
  6. -1

    Si può semplicemente fare questo:

    {% assign find_total_issued = dailysalesreport | find: "TotalIssued":"13" %}
    
    public static List<object> Find(object collection, string column, string value)

    E raggiungere la destinazione come l’astrazione della funzione è sjare.

  7. -2

    Heres una cattiva idea, ma funziona:

    {{ 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)

Lascia un commento