Django 3.2 Admin中get_readonly_fields行为不一致问题求解
问题根源
状态不回退的核心原因是直接修改了
ModelAdmin实例的readonly_fields属性:Django的ModelAdmin实例为全局单例,服务启动时仅初始化一次,修改实例属性会对后续所有请求生效,不会自动重置。
正确实现方案
1. 动态返回只读字段(无需修改实例属性)
get_readonly_fields方法本身会在每次加载Admin编辑页时被调用,你只需要每次根据当前obj的值返回对应的字段列表即可,不要修改self.readonly_fields:
class OrdineAdmin(admin.ModelAdmin): inlines = [FatturaAdmin] # 这里是默认值,仅用于新增对象(obj为None)的场景 readonly_fields = ["data"] def get_readonly_fields(self, request, obj=None): # 新增对象或者pagato为False时返回默认只读字段 if not obj or not obj.pagato: return self.readonly_fields # pagato为True时返回扩展的只读字段列表 return ['utente', 'abbonamento', 'importo', 'giorni_attivi_abbonamento', 'data']
2. 同步处理Inline的只读状态
如果你需要FatturaAdmin内的字段也跟着父模型Ordine的pagato字段动态设置只读,直接在Inline类中重写get_readonly_fields即可,方法内的obj参数就是当前父模型实例:
class FatturaAdmin(admin.TabularInline): model = Fattura # 默认只读字段 readonly_fields = ["numero_fattura"] def get_readonly_fields(self, request, obj=None): if obj and obj.pagato: # 补充你需要设置为只读的Inline字段 return self.readonly_fields + ['importo', 'data_emissione'] return self.readonly_fields
验证逻辑
- 新增Ordine对象时,
obj为None,仅data字段只读 - 已保存且
pagato=False的Ordine,仅data字段只读 - 已保存且
pagato=True的Ordine,所有指定字段只读,修改pagato为False保存后自动恢复可编辑状态
内容的提问来源于stack exchange,提问作者H3x
相关产品推荐
相关产品推荐

