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

Django Admin中exclude在change_form内不生效问题求助

解决Django Admin中request字段在修改页面仍显示的问题

我来帮你排查这个问题!你遇到的情况是因为**readonly_fields的优先级高于exclude**——哪怕你把request字段加入了exclude列表,但只要它还在readonly_fields里,Django Admin就会把它渲染成只读字段展示在表单中。

具体修改步骤:

  1. 从readonly_fields中移除'request'字段,因为你本来就想排除它,不需要让它出现在表单里。
  2. 可以删掉get_form方法里重复设置self.exclude = ['request']的代码,类级别的exclude = ('request',)已经能生效了,没必要在方法里重复定义。

修改后的CommandAdmin代码如下:

from django.contrib import admin
class CommandAdmin(admin.ModelAdmin):
    list_display = ('name','status','get_requester', 'justification')
    # 移除了readonly_fields里的'request'
    readonly_fields = ('name','status','get_requester', 'justification')
    exclude = ('request',)
    
    def get_requester(self,obj):
        return obj.request.requester
    get_requester.command_order_field = 'requester' # 支持列排序
    get_requester.short_description = 'Who Requested' # 列名重命名
    
    # 简化get_form方法,去掉重复的exclude设置
    def get_form(self, request, obj=None, **kwargs):
        form = super(CommandAdmin, self).get_form(request, obj, **kwargs)
        return form
    
    def get_queryset(self, request):
        # 注意:Python3里print需要加括号,改成print(request)
        print(request)
        qs = super(CommandAdmin, self).get_queryset(request).select_related('request')
        return qs.filter(status='pending', request__isnull=False)

额外说明:

如果你其实想在修改页面展示request关联的信息(比如请求者),但不想让request字段本身出现在表单里,你已经通过get_requester这个自定义只读字段实现了这个需求,完全不需要把request字段加入readonly_fields。

内容的提问来源于stack exchange,提问作者Red Cricket

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:33:31