2013-02-12 11 views
5

anzuzeigen Ich möchte mein Widget auf dem Feld bei django Admin anzeigen, wenn das Feld schreibgeschützt ist.django admin Wie Widget auf readonly Feld

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 

Wenn die Datei nicht schreibgeschützt ist, zeigt es Widget OK. Aber wenn ich es als readonly einschließe, sehe ich Textzeile. (Django benutzt mein Formular nicht, wenn es nur gelesen wird)

Wie kann ich es bekommen, Form sogar am readonly Feld zu benutzen?

oder

Wie ein anderes Widget angezeigt, wenn ich nur lesbar mein Feld gesetzt?

Antwort

4

Ich würde sagen, es ist eine Funktion.

Wenn das Feld schreibgeschützt ist, verwendet Django die Funktion display_for_field, die das Ergebnis fest codiert, Sie können es jedoch nicht anpassen.

Ein anderer Ansatz wäre, das Feld nicht als schreibgeschützt zu setzen und formfield_for_dbfield, eine undokumentierte Methode ModelAdmin zu überschreiben und entsprechend Ihren Anforderungen zu handeln.

3

Eine alternative und flexiblere Lösung ist es, die „disabled“ Attribut dieser Felder, die Sie im schreibgeschützten Modus rendern wollen setzen, die get_form(...) Methode Ihrer Admin-Klasse überschreiben:

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 

beachten Sie, dass ich nehmen den Namen der Nur-Lese-Felder nicht von den üblichen self.readonly_fields aber aus einem anderen Array, das ich self.fake_readonly_fields genannt, um Namen zu vermeiden Überschneidungen

die Grenze der vorgeschlagenen Lösung (mit formfield_for_dbfield) ist, dass man auf diese Weise an den Render So wie alle Datenbankfelder von ag iven type, ob es schreibgeschützt sein soll oder nicht. Dies funktioniert, wenn Ihr gesamtes Formular schreibgeschützt sein sollte. Wenn Sie jedoch mit Formularen arbeiten, die nur halb gelesen werden und die Hälfte nicht, ist es besser, sich auf das Attribut disabled zu verlassen.

Weitere Einzelheiten zu meiner Antwort hier: django modeladmin, readonly_fields and boolean fields

+0

Dies sollten das '' disabled' Field' Attribut verwenden, da nicht alle Widgets, die (HTML) Attribut (zB mit einem 'django.contrib.gis.forms unterstützen. fields.PointField'), und es könnte vom Benutzer geändert werden! Daher sollte 'form.base_fields [field_name] .disabled = True' verwendet werden. – blueyed

Verwandte Themen