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"]
Вернуться на верх