Администратор Django: как отобразить в модели поле, помеченное как editable = False?

99

Несмотря на то, что поле отмечено как 'editable=False'в модели, я бы хотел, чтобы на странице администратора оно отображалось. Сейчас это поле полностью скрывает .. Как этого добиться?

GabiMe
источник

Ответы:

195

Используйте поля только для чтения . Примерно так (для django> = 1.2):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)
tback
источник
6
+1. Особенно, если вы вообще не планируете редактировать поле в админке.
Манодж Говиндан
Здесь это не работает (Django 2.0). В этом случае поле не отображается в интерфейсе администратора.
nerdoc 05
1
Я только что создал образец приложения для воспроизведения вашей ошибки (django 2.0.8, python 3.5). Это все еще отлично работает. Может еще что-то не так в вашем приложении @nerdoc?
tback 05
ой. Типичная скоростная стрельба. Не тестировал, похоже проблема с моей установкой. Спасибо и извините.
nerdoc 06
2
Для меня администратор разбился, когда я добавил его fields, но когда я добавил его, readonly_fieldsон не отображался, пока я не добавил его в оба, а затем он появился в админке.
owenfi
18

Обновить

Это решение полезно, если вы хотите, чтобы поле было редактируемым в Admin, но не редактировалось везде. Если вы хотите сохранить поле Нередактируемого в течение затем @Till Бакхаус ответ является лучшим вариантом.

Оригинальный ответ

Один из способов сделать это - использовать кастом ModelFormв админке. Эта форма может заменить обязательное поле, чтобы сделать его редактируемым. Таким образом, вы сохраняете все, editable=Falseкроме администратора. Например (проверено с 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
Это не работает, по крайней мере, в django 1.6. Форма правильно отображается в панели администратора, но когда я сохраняю форму и возвращаюсь к ней снова, значение формы снова устанавливается по умолчанию.
Euphorbium
4

Ваши поля только для чтения должны быть также в полях:

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
Габриэль
источник