Django 在特定组的用户的管理页面中隐藏类的多个属性

Django 在特定组的用户的管理页面中隐藏类的多个属性,django,django-admin,django-authentication,Django,Django Admin,Django Authentication,我目前正在与Django及其管理页面合作。我有几个具有某些属性的类。我创建了一个组,其中该组的用户有权添加、更改和删除这些类属性的若干内容。现在,类中还有一些属性,这些属性与此组的用户无关,但与超级用户无关,因此我不会在模型中删除它们。我想向该组的用户隐藏几个字段,因为我可以设置为更改、添加和删除类的每个属性,而不是类的几个属性。有可能这样做吗?如果有,怎么做?非常感谢您的帮助,如果您有任何问题,请问我 编辑: 以下内容可能对您有用,但我没有测试它 字段集必须是列表元组和其他不可编辑的类型不能使

我目前正在与Django及其管理页面合作。我有几个具有某些属性的类。我创建了一个组,其中该组的用户有权添加、更改和删除这些类属性的若干内容。现在,类中还有一些属性,这些属性与此组的用户无关,但与超级用户无关,因此我不会在模型中删除它们。我想向该组的用户隐藏几个字段,因为我可以设置为更改、添加和删除类的每个属性,而不是类的几个属性。有可能这样做吗?如果有,怎么做?非常感谢您的帮助,如果您有任何问题,请问我

编辑:


以下内容可能对您有用,但我没有测试它

字段集必须是
列表
<代码>元组和其他不可编辑的类型不能使用,因为您将在运行时编辑它们的内容。将所有字段添加到字段集中,包括要限制某些组的属性

restricted_groups = set() # you must either define this statically or fill it on runtime. But it must be a set

class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        ('custom',           {'fields': ['question_text', 'item1', 'item2']}),
        ('Date information', {'fields': ['pub_date']}),
    ]

    def change_view(self, request, object_id, extra_context=None):
        if set(request.user.groups.values_list("name", flat=True)).intersection(restricted_groups):  # If there is same group(s) in both the users groups and the restricted groups, then user will not see following fields
            filter(lambda x: x[0]=="custom", self.fieldsets)[0][1]["fields"].remove("item1")
            filter(lambda x: x[0]=="custom", self.fieldsets)[0][1]["fields"].remove("item1")
        return super(QuestionAdmin, self).change_view(request, object_id, extra_context=extra_context)
您也可以使用相同的方法添加视图。这是你的电话号码

更新,
请求。用户
组筛选已修复并设置为使用组名。如果您希望使用另一个属性(例如,组id),则必须对其进行更改 注意:该代码未经测试,但我是根据代码编写的(略有不同)。您最好对它进行测试,并检查它对受限组和非受限组是否都能正常工作

更新2:很明显,如果你坚持使用
fieldset
,这不是最好的方法,因为它的结构不太适合这种方法。该示例的基础是,您为每个类别(在我的示例中为
custom
)指定了一个唯一的名称,并且每个
fields
属性包含字段列表,而不是用于对其进行子分类的元组

以下是另一种方法,如果中的用户不在
受限组
中,则添加这些字段:

class completedTasks(admin.ModelAdmin):
    fieldsets =     [
            (None,  {'fields': ['date']}),
            (None,  {'fields': ['duration']}),
            (None,  {'fields': ['documentationReference']}),
            ("Extra", {'fields': []}),
                    ]

    def change_view(self, request, object_id, extra_context=None):
        if not set(request.user.groups.values_list("name", flat=True)).intersection(restricted_groups): # there is no restricted group in users groups
            filter(lambda x: x[0]=="Extra", self.fieldsets)[0][1]["fields"].extend(["field1", "field2"]) # add fields to fieldsets. extend must accept a list of fields to be added to the admin
        return super(completedTasks, self)..change_view(request, object_id, extra_context=extra_context)
更新:由于您只有一个组,您可以删除set的用法。我在我的项目中使用了
changelist\u视图
,用于此类提议,我还将其添加到了代码中

class completedTasks(admin.ModelAdmin):
    fields = ["date", "duration"]
    def change_view(self, request, object_id, extra_context=None):
        if "Azubi" not request.user.groups.values_list("name", flat=True):
            if "field1" not in self.fields:
                self.fields.append("field1")
        else:
            if "field1" in self.fields:
                self.fields.remove("field1")
        return super(completedTasks, self).change_view(request, object_id, extra_context=extra_context)

    def changelist_view(self, request, extra_context=None):
        if "Azubi" not request.user.groups.values_list("name", flat=True):
            if "field1" not in self.fields:
                self.fields.append("field1")
        else:
            if "field1" in self.fields:
                self.fields.remove("field1")
        return super(completedTasks, self).changelist_view(request, extra_context=None)

否,
request.user.groups
返回组对象列表,如果要使用group名称,则必须对
if条件进行一些修改。进行编辑。此外,我的筛选错误,它必须是
request.user.groups.all()
。我正在修复。它必须是一组组名称,如
set([“group\u name\u 1”,“group2”])
它必须是一个,因为
交集可以在集合上使用。正如我提到的,
字段集的结构更为复杂。使用
字段
更好(我在代码中与字段一起使用,效果很好),因为
字段
是一个字段列表,而
字段集
是一个
tople
s、
list
s和
dict
的列表,当我有时间检查时。我会尽量查到晚上。
class completedTasks(admin.ModelAdmin):
    fields = ["date", "duration"]
    def change_view(self, request, object_id, extra_context=None):
        if "Azubi" not request.user.groups.values_list("name", flat=True):
            if "field1" not in self.fields:
                self.fields.append("field1")
        else:
            if "field1" in self.fields:
                self.fields.remove("field1")
        return super(completedTasks, self).change_view(request, object_id, extra_context=extra_context)

    def changelist_view(self, request, extra_context=None):
        if "Azubi" not request.user.groups.values_list("name", flat=True):
            if "field1" not in self.fields:
                self.fields.append("field1")
        else:
            if "field1" in self.fields:
                self.fields.remove("field1")
        return super(completedTasks, self).changelist_view(request, extra_context=None)