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