Django Admin中exclude在change_form内不生效问题求助
解决Django Admin中
request字段在修改页面仍显示的问题 我来帮你排查这个问题!你遇到的情况是因为**readonly_fields的优先级高于exclude**——哪怕你把request字段加入了exclude列表,但只要它还在readonly_fields里,Django Admin就会把它渲染成只读字段展示在表单中。
具体修改步骤:
- 从
readonly_fields中移除'request'字段,因为你本来就想排除它,不需要让它出现在表单里。 - 可以删掉
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
相关产品推荐
相关产品推荐

