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

Django admin设置readonly_fields后,新增时无法编辑字段的解决方法

解决Django Admin中「编辑时只读、新增时可编辑」的字段需求

这个场景我太熟悉了!默认的readonly_fields配置会把字段在新增和编辑页面都锁成只读,要实现只在编辑时锁定、新增时允许修改的效果,只需要重写Admin类的get_readonly_fields方法就行——这是Django原生支持的方案,靠谱又简单。

具体实现步骤

  1. 先去掉直接在ModelAdmin里写的readonly_fields = ['some_field'](如果有其他固定要只读的字段,可以保留,后续按需调整)
  2. 重写get_readonly_fields方法,通过obj参数判断当前是新增还是编辑场景:
    • 当obj不为None时,代表是编辑已有对象的页面,返回需要设为只读的字段列表
    • 当obj为None时,代表是新增对象的页面,返回空列表或者继承父类的只读字段配置

代码示例

from django.contrib import admin
from .models import YourTargetModel

class YourTargetModelAdmin(admin.ModelAdmin):
    # 如果你有其他固定的只读字段(比如创建时间),可以在这里提前设置:
    # readonly_fields = ['created_at']

    def get_readonly_fields(self, request, obj=None):
        # 编辑场景:obj存在,添加需要锁定的字段
        if obj:
            # 要是原本有readonly_fields,记得用super()继承后再追加:
            # return super().get_readonly_fields(request, obj) + ['some_field']
            return ['some_field']
        # 新增场景:obj为空,返回默认的只读配置(空列表或父类设置)
        return super().get_readonly_fields(request, obj)

admin.site.register(YourTargetModel, YourTargetModelAdmin)

原理说明

Django Admin的get_readonly_fields方法会在渲染页面时动态生成只读字段列表,其中obj参数是当前操作的模型实例:

  • 新增对象时,还没创建出实例,所以obj是None
  • 编辑对象时,obj就是当前要修改的模型实例

通过这个判断,我们就能精准控制字段在不同场景下的可编辑状态啦。

内容的提问来源于stack exchange,提问作者Ma Mars

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:33:05