Python Django原始id字段只读权限

Python Django原始id字段只读权限,python,django,Python,Django,我有一个我正在处理的Django项目,它不允许用户在raw\u id\u字段弹出窗口中选择条目(Userentries),如果他们没有更改权限(他们根本没有)。这真的很奇怪,因为如果我在admins.py的ModelForm类中删除raw\u id\u字段属性,选择标记列表就不会发生这种情况 如果此权限行为根据不同的接口设置而更改,它如何保持一致?我的意思是,如果用户显示为select标记,则用户只有在表单上选择用户的权限。在我看来,这与Django权限的设计方式是一个巨大的一致性失败,在我看来

我有一个我正在处理的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)