2017-05-14 14 views
1

私は、常に繰り返される単純なロジックを扱うためにデコレータを作成して、冗長なコードを排除しようとしています。基本的に私が作成するすべてのビューには、ユーザーがクラスにいるかどうかを確認する次のロジックがあります。djangoデコレータのuserおよびurlパラメータへのアクセス要求

ビュー:私は次の操作を行いたいのですが

@login_required 
def view(request, class_id): 

    class_ = UserClasses.objects.get(user=request.user, class_id=class_id) 

    # if the user is in the class 
    if class_: 

@user_passes_test(in_class(request.user, class_id)) 
@login_required 
def view(request, class_id): 

をデコレータ:

from apps.classes.models import UserClasses 

def in_class(request, class_id): 
    class_ = UserClasses.objects.get(user=request.user, class_id=class_id) 
    if class_: 
     return true 
    else: 
     return false 

これを達成するについて行くための最良の方法は何ですか?

答えて

2

あなたのデコレータはUserClassesは(useruniqueであることを前提として)userclass_idの両方で行が含まれている場合は、ビュー機能は、それが(エラー応答を返しますexecuted.Otherwiseされます。この

def user_passes_test(old_fuction): 
    def new_function(request, class_id, *args, **kwargs): 
     try: 
      class_ = UserClasses.objects.get(user=request.user, class_id=class_id) 
     except Exception, e: 
      return HttpResponse('ERROR: User not present in the class') 
     return old_fuction(request, class_id, *args, **kwargs) 
    return new_function 

ようにする必要がありますERROR:ユーザーがクラスに存在しません)。

そして、あなたは機能を使用すると、ビュー機能でclass_オブジェクトをしたい場合、あなたは簡単な変更によってそれを行うことができます

@user_passes_test 
@login_required 
def view(request, class_id): 

する必要があります表示します。

def user_passes_test(old_fuction): 
    def new_function(request, class_id, *args, **kwargs): 
     try: 
      class_ = UserClasses.objects.get(user=request.user, class_id=class_id) 
     except Exception, e: 
      return HttpResponse('ERROR: User not present in the class') 
     return old_fuction(request, class_id, class_, *args, **kwargs) 
    return new_function 

のようなあなたのデコレータを変更し、ビュー機能はclass_objclass_オブジェクト

が含まれてい

@user_passes_test 
@login_required 
def view(request, class_id, class_obj): 

する必要があります

関連する問題