【发布时间】:2012-01-23 17:41:15
【问题描述】:
我创建了一些代码来区分 Django admin 中的两个用户组,从而以只读方式显示所有字段或仅显示其中一些字段,这些字段直接在 ModelAdmin 类中设置。
首先是代码:
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 从哪里获取所有字段(只读)?
【问题讨论】:
标签: python django django-admin