首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将Queryset从装饰器传递给函数

将Queryset从装饰器传递给函数
EN

Stack Overflow用户
提问于 2018-05-12 10:59:33
回答 2查看 177关注 0票数 1

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

decorator.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

views.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')

是的,只是检查用户是否有权编辑帖子。欢迎任何评论。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-12 11:27:16

是的,使用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的回答提到了一个有效的观点。

票数 2
EN

Stack Overflow用户

发布于 2018-05-12 11:08:43

为什么要使用装饰器,因为你可以简单地做

wifi = get_object_or_404(Wifi, pk=wifi_id, author=request.user) 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50302457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档