2013-02-12 10 views
5

Voglio visualizzare il mio widget sul campo su admin di django quando il campo è in sola lettura.django admin come visualizzare widget su campo readonly

admin.py

class AudioTrackAdminInline(admin.StackedInline): 
    model = AudioTrack 
    form = AudioTrackForm 
    readonly_fields = ('file',) 

forms.py

class AudioTrackForm(forms.ModelForm): 
    class Meta: 
     model = AudioTrack 
     widgets = { 'file': MediaFileInput, } # my widget 

Quando il file non è di sola lettura, visualizza widget di OK. Ma quando lo includo come readonly, vedo la riga di testo. (Django non usa il mio modulo se in sola lettura)

Come posso usare il modulo anche nel campo di sola lettura?

o

Come visualizzare un altro widget se ho impostato il mio campo di sola lettura?

risposta

4

Direi che è una funzionalità.

Quando il campo è impostato in sola lettura, Django utilizza la funzione display_for_field che codifica il risultato, non è possibile personalizzarlo.

Un altro approccio sarebbe non impostare il campo come readonly e sovrascrivere formfield_for_dbfield, un metodo non documentato ModelAdmin e agire di conseguenza alle proprie esigenze.

3

Una soluzione alternativa e più flessibile è quello di impostare l'attributo "disabile" di quei campi che si desidera rendere in modalità di sola lettura, l'override del metodo get_form(...) della classe admin:

def get_form(self, *args, **kwargs): 

    form = super(SupplierAdmin, self).get_form(*args, **kwargs) 

    for field_name in self.fake_readonly_fields: 
     form.base_fields[field_name].disabled = True 

    return form 

nota che ho prendere il nome di campi di sola lettura, non dalla solita self.readonly_fields ma da una matrice diversa che ho chiamato self.fake_readonly_fields, al fine di evitare nome sovrappone

il limite della soluzione proposta (usando formfield_for_dbfield) è che in questo modo il rendering al allo stesso modo tutti i campi del database di ag tipo, se dovrebbe essere di sola lettura o meno. In questo modo funziona se l'intero modulo deve essere di sola lettura, ma se si tratta di moduli a metà sola lettura e metà no, è meglio fare affidamento sull'attributo disabled.

Ulteriori dettagli sulla mia risposta qui: django modeladmin, readonly_fields and boolean fields

+0

Questa dovrebbero utilizzare il disabled' attributo '' Field', dal momento che non tutti i widget supporta l'attributo (HTML) (ad esempio con un 'django.contrib.gis.forms. fields.PointField'), e potrebbe essere modificato dall'utente! Quindi 'form.base_fields [field_name] .disabled = True' dovrebbe essere usato. – blueyed

Problemi correlati