加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 了解django admin readonly_fields

发布时间:2020-12-20 12:27:43 所属栏目:Python 来源:网络整理
导读:我创建了一些代码来区分Django admin中的两个用户组,导致只读取所有字段或仅显示其中的一些字段,这些字段直接在ModelAdmin类中设置. 这里首先是代码: class PersonAdmin(admin.ModelAdmin): readonly_fields = ('created_at','created_by',)def get_form(se
我创建了一些代码来区分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)

我在组之间划分并相应地设置字段.如果来自两个组的用户没有同时登录,一切正常!在“只读”用户登录后,adminuser也将只读取所有字段.

我的检查也提供了一个解决方案:
如果我在for block中为adminuser添加了一个额外的if语句,一切都按预期工作.

if str(group) == 'adminuser':
    self.readonly_fields = PersonAdmin.readonly_fields

为什么那样以及那里发生了什么?

我没有进行特殊的缓存设置,它发生在开发服务器以及带有WSGI的Apache上.

根据我的理解,request.user.groups.all()应该返回当前登录用户所属的所有组.如果另一个用户在不同的IP和会话上匹配这个if块,那么Django从哪里获取allfields(readonly)?

解决方法

ModelAdmin仅对其收到的所有请求实例化一次.因此,当您定义这样的只读字段时,您将永久地设置它.

只要您运行Django 1.2,就可以使用get_readonly_fields方法来实现此目的:

class MyModelAdmin(admin.ModelAdmin):
    ...

    def get_readonly_fields(self,obj=None):
        if request.user.is_superuser:
            return super(MyModelAdmin,self).get_readonly_fields(request,obj)
        else:
            return ('created_at','created_by')

从ModelAdmin中删除readonly_fields属性,或将其设置为每个人应该只读的字段.然后,在else块中指定仅对非超级用户应该只读的所有字段.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读