Django admin设置readonly_fields后,新增时无法编辑字段的解决方法
解决Django Admin中「编辑时只读、新增时可编辑」的字段需求
这个场景我太熟悉了!默认的readonly_fields配置会把字段在新增和编辑页面都锁成只读,要实现只在编辑时锁定、新增时允许修改的效果,只需要重写Admin类的get_readonly_fields方法就行——这是Django原生支持的方案,靠谱又简单。
具体实现步骤
- 先去掉直接在ModelAdmin里写的
readonly_fields = ['some_field'](如果有其他固定要只读的字段,可以保留,后续按需调整) - 重写
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
相关产品推荐
相关产品推荐

