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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:25:19