我尝试过各种方法来实现这一目标.
我决定不要覆盖formfield_for_dbfield,因为它没有得到请求对象的副本,我希望避免使用thread_locals hack.
我决定在我的ModelAdmin类中重写get_form并尝试以下方法:
class PageOptions(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if request.user.is_superuser:
self.fieldsets = ((None, {'fields': ('title','name',),}),)
else:
self.fieldsets = ((None, {'fields': ('title',),}),)
return super(PageOptions,self).get_form(request, obj=None, **kwargs)
Run Code Online (Sandbox Code Playgroud)
当我从get_form中打印fieldsets或declared_fieldsets时,我得到None(或者我在PageOptions中设置的初始值).
为什么这不起作用,是否有更好的方法来做到这一点?
我是Python和Django的新手:)我需要一些帮助.
我想做的事:
我有一个模型页面,我需要在有人尝试更新一个对象时添加自定义字段"消息".
为什么?因为我正在建立一个修订系统.这个领域,它只是对变化的解释.所以这个字段没有链接到Page(但是链接到另一个模型PageRevision)
经过一些研究,我设法将此字段添加到admin.py文件中的表单,如下所示:
class PageAdminForm(forms.ModelForm):
# custom field not backed by database
message = forms.CharField(required=False)
class Meta:
model = Page
Run Code Online (Sandbox Code Playgroud)
它的工作,我的领域现在显示...但我不希望这个领域到处都是.就在有人试图更新Page对象时.我发现这个答案不同的字段为添加和更改页面在管理员,但它不适合我,因为它是一个自定义字段(我认为).
我在admin.py中的其余代码:
class PageAdmin(admin.ModelAdmin):
form = PageAdminForm
fields = ["title", "weight", "description", "message"]
list_display = ["title", "weight", "description"]
list_filter = ["updated_at"]
def get_form(self, request, obj=None, **kwargs):
if obj is None:
# not working ?
kwargs['exclude'] = ['message']
# else:
# kwargs['exclude'] = ['message']
return super(PageAdmin, self).get_form(request, obj, **kwargs)
def save_model(self, request, obj, form, change): …Run Code Online (Sandbox Code Playgroud)