2010-07-10 9 views
5

Sto provando a passare informazioni aggiuntive ai campi di un modulo Django da visualizzare in un modello. Ho cercato di ignorare il costruttore e aggiungere un'altra proprietà al campo in questo modo:Allegare informazioni aggiuntive ai campi modulo

self.fields['field_name'].foo = 'bar' 

ma nel modello questo:

{{ form.field_name.foo }} 

non stampare nulla. Qualcuno sa come aggiungere informazioni aggiuntive a un campo senza riscrivere/ereditare le classi del campo dei moduli?

+0

correlati: http://stackoverflow.com/questions/2270550/warnings-or-even-info-messages-instead-of-only-errors-in-django – guettli

risposta

6

Secondo django.forms.forms, il metodo di un Form__getitem__() crea qualcosa chiamato un BoundField fuori dal campo prima di restituirlo, spogliando così di tutte le modifiche che hai fatto. Se davvero si vuole inserire più funzionalità in questo, ignorare che il metodo di fare cose per il campo associato prima di restituirlo:

class MyForm(forms.Form): 
    def __getitem__(self, name): 
     boundfield = super(forms.Form,self).__getitem__(name) 
     boundfield.foo = "bar" 
     return boundfield 

Poi, apparirà "bar" per tutti i campi di quella forma. Puoi anche creare una funzione e chiamarla invece, per renderla più di una semplice stringa hard-coded.

Mentre è più normale aggiungere più campi o aggiungere proprietà al modulo stesso, se si dispone di una nuova classe di informazioni che ogni campo deve contenere, è possibile farlo per te.


Un altro modo per ottenere la stessa cosa è quella di modificare un attributo del campo, quindi accedervi tramite "field" l'attributo 's il BoundField:

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs) 
     super(forms.Form, self).__init__(*args, **kwargs) 
     self.fields['field_name'].foo = "bar" 

Poi, per accedere foo in un modello:

{{ form.field_name.field.foo }} 
+1

Grazie per t lui spiegazione. Ho provato l'ultimo dei due approcci e ha funzionato come un incantesimo - grazie ancora. – Max

Problemi correlati