我有 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
它基于评论覆盖值的问题是因为它在同一个端口(同一个实例)上运行,所以使项目在两个不同的端口上运行,所以问题不存在。因为当您访问同一个端口时,它将对两个用户具有相同的权限,因此我们需要重新启动服务器。
这是我找到的,如果有任何遗漏信息,请更新
@更新 存在一个缓存问题,这就是为什么它会覆盖权限,需要为其找到解决方案,问题是如果您使用其他用户登录没有作者组并且注销并使用具有作者组的用户登录将无法编辑复选框,因此存在缓存问题 一旦我找到解决方案,将很快更新它。 如果我重新启动服务器它工作正常,但重新启动服务器不是正确的解决方案。
所以在经历了这个问题之后,发现了 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
