我有一个视图功能,我只想使用请求方法是POST。我在这里了解了require_POST装饰器,但我想要的是如果方法不是POST,那么使用HttpResponseRedirect
将用户重定向到不同的视图。我怎么能这样做?
from django.views.decorators.http import require_POST
@require_POST
def my_view(request):
# I can assume now that only POST requests make it this far
# ...
我知道我可以通过添加两行代码来实现,而不是在我的方法本身中使用require_POST重定向,例如
if request.method != 'POST':
return HttpResponseRedirect(view_url)
但是我对使用装饰器本身更感兴趣,当这个装饰器引发405时,然后重定向到另一个视图。
答案 0 :(得分:1)
您必须使用自定义装饰器。您可以看到Django decorator here的代码。它已经在你的代码到达之前就已经返回了一个响应,所以你在视图函数中所做的一切都无论如何都会运行。
如果请求不是POST,手动返回重定向没有任何问题。如果你在代码中的几个不同的地方使用这个模式,我会稍后将它重构为装饰器。但如果这是你使用它的第一个地方,那就太过分了。
答案 1 :(得分:1)
自定义装饰器是可行的方法。
我自己使用的类似于你需要的那个,我会发布代码。
自从他成为第一个以来,请回复@aychedee的回答。 :)
def require_post_decorator(function=None, redirect_url='/'):
def _decorator(view_function):
def _view(request, *args, **kwargs):
if request.method == 'POST':
#do some before the view is reached stuffs here.
return view_function(request, *args, **kwargs)
else:
return HttpResponseRedirect(redirect_url)
_view.__name__ = view_function.__name__
_view.__dict__ = view_function.__dict__
_view.__doc__ = view_function.__doc__
return _view
if function:
return _decorator(function)
return _decorator