我创建了一些代码来区分Django管理界面中的两个用户组,结果是显示所有字段为只读或仅显示在ModelAdmin类中直接设置的某些字段。
首先是这段代码:
我将分组并相应地设置字段。如果两个组的用户没有同时登录,则一切正常!但是,如果一个“只读”用户登录后,管理员用户也将获得所有只读字段。我的检查提供了一个解决方案:如果在for循环块中增加一个针对管理员用户的if语句,则一切都可以按预期工作。
首先是这段代码:
class PersonAdmin(admin.ModelAdmin):
readonly_fields = ('created_at','created_by',)
def get_form(self, request, obj=None, **kwargs):
if obj: # we are in edit mode
if request.user.is_superuser:
self.readonly_fields = ()
else:
for group in request.user.groups.all():
if str(group) == 'readonlyuser':
allfields = tuple(obj._meta.get_all_field_names())
self.readonly_fields = allfields
return super(PersonAdmin, self).get_form(request, obj, **kwargs)
我将分组并相应地设置字段。如果两个组的用户没有同时登录,则一切正常!但是,如果一个“只读”用户登录后,管理员用户也将获得所有只读字段。我的检查提供了一个解决方案:如果在for循环块中增加一个针对管理员用户的if语句,则一切都可以按预期工作。
if str(group) == 'adminuser':
self.readonly_fields = PersonAdmin.readonly_fields
为什么会这样?发生了什么?
我没有设置特殊的缓存,它在开发服务器和安装WSGI的Apache上都会发生。
据我所知,request.user.groups.all()应该返回当前登录用户所属的所有组。如果不同IP和会话的其他用户匹配此if块,Django从哪里获取所有字段(只读)?