簡體   English   中英

當用戶位於管理頁面上時,Django自定義管理器將返回所有內容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM