我有几个非常自定义的Django ModelAdmins,如果用户是超级用户,我想添加额外的字段。我发现有人说要覆盖像这样的get_fieldsets方法
def get_fieldsets(self, request, obj=None):
fieldsets = super(PageAdmin, self).get_fieldsets(request, obj)
if request.user.is_superuser:
fieldsets[0][1]['fields'].insert(0,'group')
fieldsets[0][1]['fields'].insert(2,'is_live')
else:
groups = request.user.page_groups.filter(
is_live = True,
)
if groups.count() > 1:
fieldsets[0][1]['fields'].insert(0,'group')
return fieldsets
这可以(有点)并且我喜欢使用get_fieldsets,因为它允许我将字段分组到字段集中。 我还在此管理员上使用了get_form,因为表单有几个用户特定的表单字段,其中包含基于用户的查询集。
def get_form(self, request, obj=None, **kwargs):
if request.user.is_superuser:
return PageForm
else:
form = RestrictedPageForm
form.owner = request.user #(this may be a bad way to do this but it works I think)
return form
现在我遇到了我认为是线程问题。
如果您在浏览器中快速刷新change_form页面,您会在表单中看到多个“group”或“is_live”字段。
我真的很喜欢利用管理员让我不必编写所有内容,但我无法找到如何正确执行此操作。任何帮助或建议将不胜感激!
答案 0 :(得分:2)
问题在于,即使fieldsets
,您仍然会更改ModelAdmin
上的get_fieldsets
属性,这不是线程安全的。
执行此操作的最佳方法是指定单独的字段集:
fieldsets = (...)
restricted_fieldsets = (...)
然后:
def get_fieldsets(self, request, obj=None):
if some_condition:
return self.restricted_fieldsets
else:
return super(MyModelAdmin, self).get_fieldsets(request, obj=obj)