Python Django原始id字段只读权限
我有一个我正在处理的Django项目,它不允许用户在Python Django原始id字段只读权限,python,django,Python,Django,我有一个我正在处理的Django项目,它不允许用户在raw\u id\u字段弹出窗口中选择条目(Userentries),如果他们没有更改权限(他们根本没有)。这真的很奇怪,因为如果我在admins.py的ModelForm类中删除raw\u id\u字段属性,选择标记列表就不会发生这种情况 如果此权限行为根据不同的接口设置而更改,它如何保持一致?我的意思是,如果用户显示为select标记,则用户只有在表单上选择用户的权限。在我看来,这与Django权限的设计方式是一个巨大的一致性失败,在我看来
raw\u id\u字段
弹出窗口中选择条目(User
entries),如果他们没有更改权限(他们根本没有)。这真的很奇怪,因为如果我在admins.py的ModelForm
类中删除raw\u id\u字段
属性,选择标记列表就不会发生这种情况
如果此权限行为根据不同的接口设置而更改,它如何保持一致?我的意思是,如果用户显示为select标记,则用户只有在表单上选择用户的权限。在我看来,这与Django权限的设计方式是一个巨大的一致性失败,在我看来,除了可以添加、更改、删除之外,Django权限还应该具有本机的can\u view
权限
在谷歌搜索时,我发现了一些讨论这个问题的话题,但所有这些话题最终都有一些非常痛苦的解决方案,对我来说似乎并不简单。我想知道这么简单的东西是否有一个简单的解决方案,而不需要很多变通方法
下面是一个与我的实际代码类似的示例:
models.py
管理员.py
正如你所说,这真的很奇怪。这就是为什么我有时选择“扩展”django管理员以满足我的特定需求
实现此目标的最简单方法是重写引用的ModelAdmin的
由于将请求对象作为方法的参数,因此可以计算:
- 如果请求是否来自原始\u id\u字段
- 用户是否具有查看该模型的权限
- 你还有其他限制吗
该方法的简单原型:
def has_change_permission(self, request, obj=None):
if obj is None and '_popup' in request.GET:
return True
return super(MyAdmin, self).has_change_permission(request, obj)
成功了!我已经在我的管理员上覆盖了用户模型的has_change_权限。感谢您的帮助。请考虑到这是最简单的方法,因此根本不安全,因为任何用户都可以通过在查询字符串中添加_pop来访问您的变更列表。我忘了提到我的Django版本(1.7.4)的参数是_pop,而不是_pop。不知道其他版本。可能是我的错,我在写答案时没有测试它。在我的用例中,如果用户可以访问变更列表,则没有问题,因为他们无论如何都无法修改或添加变更列表。
class ProjectAdmin(admin.ModelAdmin):
raw_id_fields = ['manager',]
...
def has_change_permission(self, request, obj=None):
if obj is None and '_popup' in request.GET:
return True
return super(MyAdmin, self).has_change_permission(request, obj)