我有一个装饰器,它执行与它所附加的函数相同的查询。有没有一种方法可以直接从装饰器传递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')
是的,只是检查用户是否有权编辑帖子。欢迎任何评论。
发布于 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的回答提到了一个有效的观点。
发布于 2018-05-12 11:08:43
为什么要使用装饰器,因为你可以简单地做
wifi = get_object_or_404(Wifi, pk=wifi_id, author=request.user)
https://stackoverflow.com/questions/50302457
复制相似问题