Django Admin:仅拥有查看权限的用户无法显示表单新增额外字段
解决Django Admin中只读权限用户无法看到自定义表单字段初始值的问题
问题原因
当用户仅拥有Foo模型的查看权限时,Django Admin会自动切换为只读视图模式。此时Admin只会渲染模型原生字段和readonly_fields列表中指定的字段,而你新增的extra_field是表单自定义字段,既不属于模型字段,也未被加入readonly_fields,因此不会被显示。
解决方案
方法一:将自定义字段加入只读字段列表
修改FooAdmin类,把extra_field添加到readonly_fields中,并通过get_readonly_fields控制不同权限下的只读字段逻辑:
@admin.register(models.Foo) class FooAdmin(ModelAdmin): fieldsets = (('Foo', {'fields': ('extra_field',)})) form = forms.FooForm readonly_fields = ('extra_field',) def get_readonly_fields(self, request, obj=None): # 仅当用户无修改权限时,保持extra_field为只读;有修改权限则沿用原有表单逻辑 if not request.user.has_perm('your_app_name.change_foo'): return self.readonly_fields return super().get_readonly_fields(request, obj)
方法二:在Admin中定义字段显示方法
如果不需要在编辑模式下修改extra_field(仅做展示),可以直接在FooAdmin中定义该字段的显示方法,确保只读模式下能返回固定初始值:
@admin.register(models.Foo) class FooAdmin(ModelAdmin): fieldsets = (('Foo', {'fields': ('extra_field',)})) form = forms.FooForm readonly_fields = ('extra_field',) def extra_field(self, obj): # 返回固定初始值,也可根据obj动态生成 return 'extra_field'
说明
- 方法一保留了编辑模式下
extra_field的可编辑性,同时让只读权限用户能看到初始值; - 方法二更适合仅需展示
extra_field的场景,无需依赖表单的初始值设置。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

