Django admin: come visualizzare un campo contrassegnato come modificabile = False 'nel modello?


99

Anche se un campo è contrassegnato come 'editable=False'nel modello, vorrei che fosse visualizzato dalla pagina di amministrazione. Attualmente nasconde del tutto il campo .. Come si può ottenere questo risultato?

Risposte:


195

Usa campi di sola lettura . In questo modo (per django> = 1.2):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)

6
+1. Soprattutto se non prevedi di modificare affatto il campo in Admin.
Manoj Govindan

Questo non funziona qui (Django 2.0). Il campo non viene quindi visualizzato nell'interfaccia di amministrazione.
nerdoc

1
Ho appena creato un'applicazione di esempio per riprodurre il tuo errore (django 2.0.8, python 3.5). Funziona ancora bene. Forse qualcos'altro non va nella tua app @nerdoc?
ritorno il

oOops. Tipico tiro veloce. Non testato, sembra essere un problema con la mia installazione. Grazie e scusa.
nerdoc

2
Per me l'amministratore si è bloccato quando l'ho aggiunto a fields, ma quando l'ho aggiunto non readonly_fieldsè stato visualizzato fino a quando non l'ho aggiunto a entrambi e poi è apparso in admin.
owenfi

18

Aggiornare

Questa soluzione è utile se si desidera mantenere il campo modificabile in Admin ma non modificabile ovunque. Se vuoi mantenere il campo non modificabile per tutto il tempo, la risposta di @Till Backhaus è l'opzione migliore.

Risposta originale

Un modo per farlo sarebbe utilizzare un'abitudine ModelFormin admin. Questo modulo può sovrascrivere il campo richiesto per renderlo modificabile. In tal modo manterrai editable=Falseovunque tranne Admin. Ad esempio (testato 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)

1
Questo non funziona, almeno su django 1.6 Il modulo viene visualizzato correttamente nel pannello di amministrazione, ma quando salvo un modulo e ci ritorno di nuovo, il valore del modulo è di nuovo predefinito.
Euphorbium

4

I tuoi campi di sola lettura devono trovarsi anche nei campi:

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.