2013-04-07 72 views
0

我有一個視圖函數,我只想使用請求方法是POST。我在這裏瞭解了require_POST裝飾器,但我想要的是如果方法不是POST,那麼使用HttpResponseRedirect將用戶重定向到不同的視圖。我怎樣才能做到這一點 ?響應重定向到不同的頁面時405提高

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,然後重定向到另一個視圖。

回答

1

自定義裝飾器是要走的路。

我自己使用一個類似於你需要的,我會發布代碼。

做upvote @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 
1

你將不得不使用自定義裝飾器。您可以看到Django decorator here的代碼。它已經在你的代碼到達之前返回了一個響應,所以你的視圖函數中的任何操作都不會被執行。

如果請求不是POST,手動返回重定向沒有任何問題。如果你在你的代碼的幾個不同的地方使用這個模式,我會在稍後將它重構成一個裝飾器。但如果這是你使用它的第一個地方,那麼它是過度殺傷。

相關問題