Django admin: Як відобразити поле, яке позначено як редаговане = False 'у моделі?


99

Незважаючи на те, що поле позначене як 'editable=False'у моделі, я хотів би, щоб його відображала сторінка адміністратора. В даний час він взагалі приховує поле .. Як цього можна досягти?

Відповіді:


195

Використовуйте поля лише для читання . Ось так (для django> = 1,2):

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

6
+1. Особливо, якщо ви взагалі не плануєте редагувати поле в Admin.
Маной Говіндан,

Тут це не працює (Django 2.0). Тоді поле не відображається в інтерфейсі адміністратора.
nerdoc

1
Я щойно створив зразок програми для відтворення вашої помилки (django 2.0.8, python 3.5). Це все ще працює нормально. Можливо, щось інше не так у вашому додатку @nerdoc?
назад

ой Типовий швидкий знімок. Не тестував, здається, проблема з моєю установкою. Дякую, і вибачте.
nerdoc

2
Для мене адміністратор зазнав аварії, коли я додав його fields, але коли я додав його, readonly_fieldsвін не з'явився, поки я не додав його до обох, а потім він з'явився в адміністраторі.
owenfi

18

Оновлення

Це рішення корисне, якщо ви хочете, щоб поле залишалося редагованим в адміністраторі, але не можна редагувати скрізь. Якщо ви хочете зберегти поле Нередагована в протягом потім @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. Форма відображається правильно на адміністративній панелі, але коли я зберігаю форму і повертаюся до неї, значення форм знову є типовим.
Еуфорбій,

4

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

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.