Django admin get_readonly_fields непоследовательное поведение
У меня такой же запрос, как и у этой другой темы, я использую Django 3.2.8
Для моего проекта некоторые поля на страницах Admin должны стать readonly на основе значения одного поля boolean того же объекта модели, поэтому я применил решение, которое посоветовали в другой теме выше.
class OrdineAdmin(admin.ModelAdmin):
inlines = [
FatturaAdmin
]
readonly_fields = ["data"]
def get_readonly_fields(self, request, obj=None):
if obj and obj.pagato == True:
self.readonly_fields = ['utente', 'abbonamento', 'importo', 'giorni_attivi_abbonamento', 'data']
return self.readonly_fields
Как я и ожидал, это решение приведет к некоторой непоследовательности в панели администратора, поскольку один экземпляр OrdineAdmin будет создан в памяти, но он не будет обновляться при каждом запросе. Поэтому, когда я устанавливаю поле "pagato" в True, этот метод устанавливает все остальные поля в readonly, как и ожидалось, но не отменяет своего эффекта, если я установлю это поле обратно в False, даже если процесс сохранения через панель администратора пройдет успешно.
Поэтому я думал, что что-то нужно сделать внутри метода __init__()
, но я прочитал ответ в этой другой теме, где в отношении встроенных элементов администрирования говорится, что это не имеет смысла, в отличие от того, что я считал, потому что:
Также не имеет смысла устанавливать подобные значения в init, поскольку экземпляр Modeladmin создается один раз и может сохраняться в течение гораздо большего количества времени, чем один запрос!
Теперь я совсем запутался. Как я могу предоставить обновление для каждого запроса на страницах ModelAdmin для последовательного поведения моей логики полей, доступных для чтения?
На моей стороне, я пытался получить доступ к объекту внутри __init__()
с помощью метода get_object()
, но мне нужно предоставить id объекта, к которому я все еще не понял, как получить доступ. Но если то, что я читал выше, правда, то все равно было бы бесполезно предоставлять логику конструктору, поскольку экземпляры в любом случае будут существовать дольше, чем запрос
Может быть, мне следует обратиться к форме с помощью get_form()
или в моем случае get_formsets_with_inlines()
и настроить эти методы? Но как мне убедиться, что они будут генерироваться заново при каждом запросе?
Когда pagato
установлено значение True, вы переопределяете свойство readonly_fields
этой строкой:
self.readonly_fields = ['utente', 'abbonamento', 'importo', 'giorni_attivi_abbonamento', 'data']
Поэтому, когда pagato
снова устанавливается в False, get_readonly_fields
возвращает обновленную версию вместо исходной.
Попробуйте это:
class OrdineAdmin(admin.ModelAdmin):
inlines = [
FatturaAdmin
]
readonly_fields = ["data"]
def get_readonly_fields(self, request, obj=None):
if obj and obj.pagato == True:
return ['utente', 'abbonamento', 'importo', 'giorni_attivi_abbonamento', 'data']
return self.readonly_fields
Или более сжато:
class OrdineAdmin(admin.ModelAdmin):
inlines = [
FatturaAdmin
]
def get_readonly_fields(self, request, obj=None):
if obj and obj.pagato == True:
return ['utente', 'abbonamento', 'importo', 'giorni_attivi_abbonamento', 'data']
return ["data"]