Django admin: Wie wird ein Feld angezeigt, das im Modell als editierbar = Falsch markiert ist?

98

Obwohl ein Feld wie 'editable=False'im Modell markiert ist , möchte ich, dass es auf der Administrationsseite angezeigt wird. Derzeit verbirgt es das Feld insgesamt. Wie kann dies erreicht werden?

GabiMe
quelle

Antworten:

194

Verwenden Sie schreibgeschützte Felder . Wie so (für django> = 1.2):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)
tback
quelle
6
+1. Vor allem, wenn Sie das Feld in Admin überhaupt nicht bearbeiten möchten.
Manoj Govindan
Dies funktioniert hier nicht (Django 2.0). Das Feld wird dann in der Admin-Oberfläche nicht angezeigt.
Nerdoc
1
Ich habe gerade eine Beispielanwendung erstellt, um Ihren Fehler zu reproduzieren (Django 2.0.8, Python 3.5). Das funktioniert immer noch gut. Vielleicht stimmt etwas anderes in Ihrer App @nerdoc nicht?
Tback
oops. Typischer Fast-Shot. Nicht getestet, scheint ein Problem mit meiner Installation zu sein. Danke und Entschuldigung.
Nerdoc
2
Für mich stürzte der Administrator ab, als ich es hinzufügte fields, aber als ich es hinzufügte, wurde readonly_fieldses nicht angezeigt, bis ich es beiden hinzufügte und es dann in admin erschien.
Owenfi
18

Aktualisieren

Diese Lösung ist nützlich, wenn Sie das Feld in Admin bearbeitbar, aber nicht überall bearbeitbar lassen möchten. Wenn Sie das Feld nicht editierbar halten wollen überall dann @Till Backhaus Antwort ist die bessere Option.

Ursprüngliche Antwort

Eine Möglichkeit, dies zu tun, besteht darin, eine benutzerdefinierte ModelFormDatei in admin zu verwenden. Dieses Formular kann das erforderliche Feld überschreiben, um es bearbeitbar zu machen. Dabei behalten Sie alles editable=Falseandere als Admin. Zum Beispiel (getestet mit 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
quelle
1
Dies funktioniert zumindest unter django 1.6 nicht. Das Formular wird im Admin-Bereich korrekt angezeigt. Wenn ich jedoch ein Formular speichere und wieder dorthin zurückkehre, ist der Formularwert wieder Standard.
Euphorbium
4

Ihre schreibgeschützten Felder müssen sich auch in Feldern befinden:

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