Skip to main content
 首页 » 编程设计

python之根据更改权限更新 django 中的 readonly_fields

2024年11月01日31qq78292959

我有 python django 项目,我用它来显示所有书籍和渲染 单击每本书时只有一本书,因此 django 将自动生成 图书详情。

所以在渲染时我想让 price_upgrade bool 字段只在用户没有 称为作者的组

所以我的代码是这样的

class BookAdmin(admin.ModelAdmin): 
    list_per_page = 10 
    list_display_links = ['name'] 
    readonly_fields = ('id', 'name', 'city', 'price_upgrade') 
    ... 
    ... 
    ... 
 
def has_change_permission(self, request, obj=None): 
        if request.user.groups.all().filter(Group ='author').exists(): 
            print('author group is there') 
        else: 
            print('author group is not there') 
        #print('request', request.user.groups.all(), type(request.user.groups.all())) 
        return True 

如果当前用户没有组,我如何将 price_upgrade 字段添加到 readonly_fields author else 我们应该从 readonly_fields 中删除 price_upgrade 字段,因为他是 作者组,以便他可以编辑它

版本 python 2.7 Django 1.8

感谢任何帮助

请您参考如下方法:

您可以在 BookAdmin 中像这样覆盖 changeform_view

       def changeform_view(self, request, *args, **kwargs): 
            self.readonly_fields = list(self.readonly_fields) 
            usergroup = request.user.groups.filter(name__in=['author']).exists() 
            if not usergroup: 
                self.readonly_fields.append('price_upgrade') 
 
            return super(BookAdmin, self).changeform_view(request, *args, **kwargs) 

另一个选项:已更新 您可以在您的管理员中覆盖 get_readonly_fields 方法

def get_readonly_fields(self, request, obj=None): 
    usergroup = request.user.groups.filter(name__in=['author']).exists() 
    if not usergroup: 
       # since readonly_fields is a tuple we need to append to tuple 
        self.readonly_fields = self.readonly_fields + ('price_upgrade',) 
    return self.readonly_fields 

它基于评论覆盖值的问题是因为它在同一个端口(同一个实例)上运行,所以使项目在两个不同的端口上运行,所以问题不存在。因为当您访问同一个端口时,它将对两个用户具有相同的权限,因此我们需要重新启动服务器。

这是我找到的,如果有任何遗漏信息,请更新

@更新 存在一个缓存问题,这就是为什么它会覆盖权限,需要为其找到解决方案,问题是如果您使用其他用户登录没有作者组并且注销并使用具有作者组的用户登录将无法编辑复选框,因此存在缓存问题 一旦我找到解决方案,将很快更新它。 如果我重新启动服务器它工作正常,但重新启动服务器不是正确的解决方案。

Related ref

所以在经历了这个问题之后,发现了 solution

def get_readonly_fields(self, request, obj=None): 
        readOnlyFields = super(BookAdmin, self).get_readonly_fields(request, obj) 
        usergroup = request.user.groups.filter(name__icontains='author').exists() 
        if not usergroup: 
            readOnlyFields = readOnlyFields + ('price_upgrade',) 
        return readOnlyFields