Django models 专门的管理员根据用户查看对象的子集

Django models 专门的管理员根据用户查看对象的子集,django-models,django-admin,Django Models,Django Admin,我是Django的新手,所以我可能完全偏离了正轨 我已经看到了很多关于在保存对象时能够访问当前用户的问题,但我的问题略有不同:我想使用(admin的一个特殊子类)来显示用户的对象集,但只显示他或她有权访问的那些对象 目前,我正试图通过创建一个特殊的“OpAdmin”应用程序来实现这一点,它的唯一目的就是拥有这个专门的管理员。OpAdmin模型如下所示: class OperatorAircraftManager(models.Manager): def get_query_set(s

我是Django的新手,所以我可能完全偏离了正轨

我已经看到了很多关于在保存对象时能够访问当前用户的问题,但我的问题略有不同:我想使用(admin的一个特殊子类)来显示用户的对象集,但只显示他或她有权访问的那些对象

目前,我正试图通过创建一个特殊的“OpAdmin”应用程序来实现这一点,它的唯一目的就是拥有这个专门的管理员。OpAdmin模型如下所示:

class OperatorAircraftManager(models.Manager):  
    def get_query_set(self, user):
        return mainapp.models.Aircraft.objects.filter(owner=user.employer)

class Aircraft(mainapp.models.Aircraft):
    class Meta:
        proxy = True
    objects = OperatorAircraftManager()
但是我很难弄清楚如何将用户信息传递给
get\u query\u set
,或者这是否完全是错误的方法(我应该使用
group
Permissions
做些什么吗?)同样,这不是用新飞机保存用户信息,或者限制谁可以更改一个,但是限制谁可以在管理中看到它们。如有任何建议,我们将不胜感激——谢谢

编辑:我应该补充一点,我也看到了许多与Django一起使用的“GetCurrentUser”软件包,但它们似乎都有点粗糙(比如看当前的调用堆栈),所以我不愿意走这条路。如果有一种可接受的方法来缓存有关请求上下文的一些共享信息,那么最好知道…

不确定“仅他或她有权访问的对象”是什么意思。但是,如果您想将所有对象限制为其在管理中各自的所有者,您可以这样做:

def queryset(self, request):
    """Limit Pages to those that belong to the request's user."""
    qs = super(PageAdmin, self).queryset(request)
    return qs.filter(owner=request.user)
不知道你所说的“只有他或她能接触到的对象”是什么意思。但是,如果您想将所有对象限制为其在管理中各自的所有者,您可以这样做:

def queryset(self, request):
    """Limit Pages to those that belong to the request's user."""
    qs = super(PageAdmin, self).queryset(request)
    return qs.filter(owner=request.user)

所以这就是让我困惑的地方:queryset函数的普通API签名不接受
请求
参数。添加一个请求对象如何神奇地导致请求对象传入?(“访问”功能是我的应用程序的语义——我省略了细节,因为它们不重要。)
queryset()
是一种管理方法。不是模型。忽略上面的。。。澄清:我仍然感到困惑,因为这只创建了一个函数定义。仍然需要调用该函数并提供参数。某些东西必须在admin(填充对象列表的admin部分)的内部。我不知道在哪里/如何做那部分。谢谢你@dan klasson!我现在明白了。queryset()是另一个API调用。谢谢。这就是让我困惑的地方:queryset函数的普通API签名不接受
请求
参数。添加一个请求对象如何神奇地导致请求对象传入?(“访问”功能是我的应用程序的语义——我省略了细节,因为它们不重要。)
queryset()
是一种管理方法。不是模型。忽略上面的。。。澄清:我仍然感到困惑,因为这只创建了一个函数定义。仍然需要调用该函数并提供参数。某些东西必须在admin(填充对象列表的admin部分)的内部。我不知道在哪里/如何做那部分。谢谢你@dan klasson!我现在明白了。queryset()是另一个API调用。谢谢