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