[英]Django Custom User Manager is not called when registering users on the admin panel
[英]Django custom manager return everything when user is on admin page
我正在创建Django应用。 这是一个文章应用程序。 我有一个名为hidden
的字段,当hidden
为true 且用户不在管理面板中时,我想返回一个没有文章的查询集。
管理员页面->显示所有内容
普通搜索->仅在hidden
= False时显示
我的“常规搜索”是我进行的自定义搜索。 我正在用django-filter过滤结果,我想自动过滤掉隐藏的文章。
我正在使用自定义管理器创建此文件:
class ArticleManager(models.Manager):
def get_queryset(self, request):
if request.user.is_superuser:
return super().get_queryset()
return super().get_queryset().filter(hidden=False)
但我刚得到这个错误:
TypeError: get_queryset() missing 1 required positional argument: 'request'
通常,没有request
实例将传递给管理器方法。 但是您可以使用其get_queryset()
方法来自定义管理员内部使用的get_queryset()
:
class ArticleAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super().get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(hidden=False)
请注意,此查询集也将用于编辑实例,因此您可以真正限制某些用户可以访问哪些对象。
基于更新的问题:您不应重新定义模型管理器的get_queryset
函数签名以接受request
参数。 相反,您需要使用user
参数创建一个新的管理器函数,该函数仅返回所需的项目。 然后,您将使用它作为queryset
到过滤器。
例如:
class ArticleManager(models.Manager):
def get_visible_items(self, user):
if user.is_superuser:
return super().get_queryset()
return super().get_queryset().filter(hidden=False)
# In your view:
user = request.user
artice_filter = ArticleFilter(queryset=Article.objects.get_visible_items(user))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.