Administrador de Django: ¿Cómo mostrar un campo que está marcado como editable = False 'en el modelo?

99

Aunque un campo está marcado como 'editable=False'en el modelo, me gustaría que la página de administración lo muestre. Actualmente oculta el campo por completo. ¿Cómo se puede lograr esto?

GabiMe
fuente

Respuestas:

195

Utilice campos de solo lectura . Así (para django> = 1.2):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)
tback
fuente
6
+1. Especialmente si no planea editar el campo en Admin.
Manoj Govindan
Esto no funciona aquí (Django 2.0). El campo no se muestra entonces en la interfaz de administración.
nerdoc
1
Acabo de crear una aplicación de muestra para reproducir su error (django 2.0.8, python 3.5). Esto todavía funciona bien. ¿Quizás algo más está mal en su aplicación @nerdoc?
tback
¡Vaya! Tiro rápido típico. No lo probé, parece que hay un problema con mi instalación. Gracias y lo siento.
nerdoc
2
Para mí, el administrador se bloqueó cuando lo agregué fields, pero cuando lo agregué, readonly_fieldsno apareció hasta que lo agregué a ambos y luego apareció en el administrador.
owenfi
18

Actualizar

Esta solución es útil si desea mantener el campo editable en Admin pero no editable en cualquier otro lugar. Si desea mantener el campo no editable en todo momento, la respuesta de @Till Backhaus es la mejor opción.

Respuesta original

Una forma de hacer esto sería usar un archivo personalizado ModelFormen admin. Este formulario puede anular el campo obligatorio para hacerlo editable. De este modo, conserva en editable=Falsetodos los demás lugares excepto en Admin. Por ejemplo (probado con Django 1.2.3)

# models.py
class FooModel(models.Model):
    first = models.CharField(max_length = 255, editable = False)
    second  = models.CharField(max_length = 255)

    def __unicode__(self):
        return "{0} {1}".format(self.first, self.second)

# admin.py
class CustomFooForm(forms.ModelForm):
    first = forms.CharField()

    class Meta:
        model = FooModel
        fields = ('second',)

class FooAdmin(admin.ModelAdmin):
    form = CustomFooForm

admin.site.register(FooModel, FooAdmin)
Manoj Govindan
fuente
1
Esto no funciona, al menos en django 1.6. El formulario se muestra correctamente en el panel de administración, pero cuando guardo un formulario y vuelvo a él, el valor del formulario vuelve a ser predeterminado.
Euphorbium
4

Sus campos de solo lectura también deben estar en los campos:

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
Gabriel
fuente