You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:15:07