Ottieni il tipo di widget di forma Django dal modello


1 Answers

Fare un tag modello potrebbe funzionare? Qualcosa come field.field.widget|widget_type

Modifica da Oli: buon punto! Ho appena scritto un filtro:

from django import template
register = template.Library()

@register.filter('klass')
def klass(ob):
    return ob.__class__.__name__

E ora {{ object|klass }} correttamente. Ora devo solo capire come usarlo all'interno dell'istruzione if un template.

Modifica da Oli # 2: Avevo bisogno di usare il risultato di questo in un template statetario, quindi ho solo spostato tutta la logica nel templatetag. Magia. Grazie per avermi spinto nella giusta direzione.

Question

Sto iterando attraverso i campi di un modulo e per determinati campi voglio un layout leggermente diverso, che richiede HTML alterato.

Per farlo con precisione, ho solo bisogno di conoscere il tipo di widget. Il nome della classe o qualcosa di simile. In Python standard, questo è facile! field.field.widget.__class__.__name__

Sfortunatamente, non ti è consentito accedere alle variabili di sottolineatura nei modelli. Grande!

Puoi testare field.field.widget.input_type ma questo funziona solo per i tipi text / password <input ../> . Ho bisogno di più risoluzione per quello.

Per me, per quanto difficile possa sembrare, ha più senso farlo a livello di template. Ho esternalizzato il bit di codice che gestisce l'HTML per i campi in un modello separato che viene incluso nel ciclo di campo. Ciò significa che è coerente tra ModelForm e Form standard (qualcosa che non sarebbe vero se avessi scritto una classe Form intermedia).

Se riesci a vedere un approccio universale che non mi richiede di modificare i moduli di 20 cifre, fammelo sapere!




Seguendo la risposta di Oli e rinti: ho usato questo e penso che sia un po 'più semplice:

codice modello: {{ field|fieldtype }}

codice filtro:

from django import template
register = template.Library()

@register.filter('fieldtype')
def fieldtype(field):
    return field.field.widget.__class__.__name__



Related