Создание поля только для чтения в Django Admin, на основе другого значения поля

Как создать поле в Django Admin для чтения или не редактируемого на основе значения из другого поля? Я использовал readonly_fields=('amount',), но это не исправляет мою проблему, так как мне нужно управлять ею на основе другого поля.

Ответ 1

Вы можете переопределить метод admin get_readonly_fields:

class MyAdmin(admin.ModelAdmin):

    def get_readonly_fields(self, request, obj=None):
        if obj and obj.another_field == 'cant_change_amount':
            return self.readonly_fields + ('amount',)
        return self.readonly_fields

Ответ 2

Для заполнения одного поля от другого вам нужно добавить атрибут prepopulated_fields в соответствующий класс ModelAdmin. Например:

class PostAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}

Соответствующую документацию можно найти здесь.

Однако в версии django, которую я использую в данный момент (1.3), это создает ошибку, когда используется readonly_fields.

Ответ 3

Объявить любые постоянно readonly_fields в теле класса, поскольку атрибут класса readonly_fields будет доступен из проверки