Django 1.8.7 get_readonly_fields 似乎有一个错误

Django 1.8.7 get_readonly_fields seems like have a bug

我在 Django 1.8.7 中尝试使用只读字段,假设我有如下代码:

class MyAdmin(admin.ModelAdmin):
    readonly_fields = ('a', 'b')

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            self.readonly_fields += ('c')
        return super(MyAdmin, self).get_readonly_fields(request, obj)

首先我使用超级管理员登录并访问该管理页面 change_form,

代码运行良好,然后我使用员工用户登录,然后仍然运行良好,我再次尝试使用超级管理员登录,但呈现的只读字段是针对非超级管理员用户的,

我再次清除浏览器缓存,用超级管理员重试,但仍然无法正常工作。我尝试重新启动服务器,然后它正常工作,直到我重复上面的相同步骤,这奇怪的事情又来了。

有人知道为什么会这样吗?我认为这看起来像是一些错误但不确定。

提前致谢。

错误不在 Django 中,而是在您的代码中。在您的 get_readonly_fields 方法中,您 修改 readonly_fields 属性;这些修改持续存在,因为管理对象在进程的生命周期内存在。

不要那样做。 get_readonly_fields 应该是 return 一个值,而不是修改属性。只要做:

def get_readonly_fields(self, request, obj=None):
    rfo = super(MyAdmin, self).get_readonly_fields(request, obj)
    if not request.user.is_superuser:
        rfo += ('c')
    return rfo