Administrator Django: Jak wyświetlić w modelu pole oznaczone jako editable = False?

99

Mimo że pole jest zaznaczone tak, jak 'editable=False'w modelu, chciałbym, aby strona administratora je wyświetliła. Obecnie całkowicie ukrywa to pole. Jak to osiągnąć?

GabiMe
źródło

Odpowiedzi:

195

Użyj pól tylko do odczytu . Tak (dla django> = 1.2):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)
tback
źródło
6
+1. Zwłaszcza jeśli w ogóle nie planujesz edytować tego pola w Admin.
Manoj Govindan,
To nie działa tutaj (Django 2.0). Pole nie jest wtedy wyświetlane w interfejsie administratora.
nerdoc,
1
Właśnie stworzyłem przykładową aplikację, aby odtworzyć twój błąd (django 2.0.8, python 3.5). To nadal działa dobrze. Może coś innego jest nie tak w Twojej aplikacji @nerdoc?
cofnięcie
ups. Typowy szybki strzał. Nie testowałem, wydaje się, że jest problem z moją instalacją. Dzięki i przepraszam.
nerdoc
2
Dla mnie administrator zawiesił się, kiedy dodałem go do fields, ale kiedy dodałem go do readonly_fieldsniego, nie pojawił się, dopóki nie dodałem go do obu, a potem pojawił się w admin.
owenfi
18

Aktualizacja

To rozwiązanie jest przydatne, jeśli chcesz, aby pole było edytowalne w panelu Admin, ale nie można go było edytować w innych miejscach. Jeśli chcesz, aby pole nie było edytowalne przez cały czas, odpowiedź @Till Backhaus jest lepszą opcją.

Oryginalna odpowiedź

Jednym ze sposobów byłoby użycie niestandardowego ModelFormw panelu administracyjnym. Ten formularz może zastąpić wymagane pole, aby umożliwić jego edycję. W ten sposób zachowujesz editable=Falsewszędzie poza administratorem. Na przykład (testowane z 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
źródło
1
To nie działa, przynajmniej na django 1.6 Formularz wyświetla się poprawnie w panelu administratora, ale kiedy zapisuję formularz i wracam do niego ponownie, wartość formularza jest znowu domyślna.
Euphorbium
4

Twoje pola tylko do odczytu muszą również znajdować się w polach:

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
gabriel
źródło