2016-10-31 11 views
3

私は、ユーザーが(たとえばuser.is_authenticated用)、いくつかの条件を満たしているかどうかをチェックして、この条件が成立しない場合、彼らは別のページにリダイレクトされようとしている独自のデコレータを作成しようとしています(第2パラメータ)。ジャンゴ - カスタムデコレータ - 塗りつぶされていないパラメータ

問題は、それが別のパラメータ(ビュー機能を)望んでいるので、デコレータが動作しないということです。

from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 


def condition_or_redirect(view_func, condition, redirect_to): 
    def wrapped(request, *args, **kwargs): 
     if not condition(request.user): 
      return HttpResponseRedirect(reverse(redirect_to)) 
     else: 
      return view_func(request, *args, **kwargs) 
    return wrapped 

その後、私はそれを使用したい:

@condition_or_redirect(lambda x: not x.is_authenticated,'homepage') 
def some_view.... 

コードの何が問題になっているのですか?私はそれがしたいことがあるview_func最初のパラメータを知っているが、私はそれがデコレータ自体によって追加されていることを考えました。

答えて

4

あなたはデコレータにパラメータを渡したい場合は、あなたがネストの第3レベルを定義する必要があります。最初のレベルは、パラメータを受け入れ、機能自体をとる第二レベルを返します。だから、:

def condition_or_redirect(condition, redirect_to): 
    def wrapper(view_func): 
     def wrapped(request, *args, **kwargs): 
      if not condition(request.user): 
       return HttpResponseRedirect(reverse(redirect_to)) 
      else: 
       return view_func(request, *args, **kwargs) 
     return wrapped 
    return wrapper 
関連する問題