widgets tutorial formularios form fields example avanzados django django-forms django-admin django-widget

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.