tutorial - administrador django cómo mostrar el widget en el campo de solo lectura
formularios django (2)
Quiero mostrar mi widget en el campo en django admin cuando el campo es de solo lectura.
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
Cuando el archivo no es de solo lectura, muestra el widget OK. Pero cuando lo incluyo como de solo lectura, veo línea de texto. (Django no usa mi formulario si es de solo lectura)
¿Cómo puedo usar el formulario incluso en el campo de solo lectura?
o
¿Cómo mostrar otro widget si configuro mi campo de solo lectura?
Una solución alternativa y más flexible es establecer el atributo "deshabilitado" de los campos que desea representar en modo de solo lectura, anulando el get_form(...)
de su clase de administrador:
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
tenga en cuenta que tomo el nombre de campos readonly no del self.readonly_fields
habitual, sino de una matriz diferente que self.fake_readonly_fields
, para evitar superposiciones de nombres
El límite de la solución propuesta (usando formfield_for_dbfield
) es que de esa manera se representan de la misma forma todos los campos de la base de datos de un tipo dado, ya sea que sea de solo lectura o no. De esa manera funciona si su formulario completo debe ser de solo lectura, pero si maneja formularios que son mitad de solo lectura y mitad no, es mejor confiar en el atributo disabled
.
Más detalles sobre mi respuesta aquí: django modeladmin, readonly_fields y campos booleanos
Yo diría que es una característica.
Cuando el campo está configurado como de solo lectura, Django usa la función display_for_field
que codifica el resultado, no puede personalizarlo.
Otro enfoque sería no establecer el campo como de solo lectura y anular formfield_for_dbfield
, un método ModelAdmin
no ModelAdmin
y actuar de acuerdo con sus necesidades.