将Queryset从decorator传递给函数

2024-04-24 13:37:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个decorator,它执行与其所附加的函数相同的查询。有没有一种方法可以直接从decorator传递Queryset,这样我就不必运行查询两次了?你知道吗

装饰师.py

def is_wifi_author(func):
    def wrapper(request, wifi_id, **kwargs):
        wifi = get_object_or_404(Wifi, pk=wifi_id)             # Queryset

        # Is this correct?    
        if request.user != wifi.author:
            return redirect('youshallnotpass')

        return func(request, wifi_id, **kwargs)

    return wrapper

视图.py

@is_wifi_author
def edit(request, wifi_id):
    # print(request)
    wifi = get_object_or_404(Wifi, pk=wifi_id)                 # Same queryset

    # The rest of the view

    return render(request, 'app/template.html')

是的,只是检查用户是否有权编辑帖子。欢迎发表意见。你知道吗


Tags: pyidgetreturnobjectisrequestdef
2条回答

既然你可以简单地做,为什么还要用装饰工呢

wifi = get_object_or_404(Wifi, pk=wifi_id, author=request.user) 

是的,可以使用kwargs:

def is_wifi_author(func):
    def wrapper(request, wifi_id, **kwargs):
        wifi = get_object_or_404(Wifi, pk=wifi_id)             # Queryset

        # Is this correct?
        if request.user != wifi.author:
            return redirect('youshallnotpass')

        return func(request, wifi_id, wiki=wiki, **kwargs)

    return wrapper


@is_wifi_author
def edit(request, wifi_id, wiki=None):
    """wiki argument is gonna be updated by the is_wifi_author decorator"""
    print('Yeii, a wiki', wiki)
    # The rest of the view

    return render(request, 'app/template.html')

尽管我认为@Ubaid答案提到了一个有效的观点。你知道吗

相关问题 更多 >