1

我有几个非常定制的 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”字段。

我真的很喜欢利用管理员来让我不必写所有东西,但我不知道如何正确地做到这一点。任何帮助或建议将不胜感激!

4

1 回答 1

4

问题是您实际上是在更改 上的fieldsets属性ModelAdmin,这不是线程安全的,即使get_fieldsets is

最好的方法是指定单独的字段集:

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)
于 2012-08-01T17:57:08.933 回答