2017-05-14 1 views
1

J'essaye d'éliminer le code redondant en créant un décorateur pour gérer une logique simple qui est toujours répétée. Fondamentalement, chaque vue que je crée a la logique suivante pour vérifier si un utilisateur est dans une classe.Demande d'accès utilisateur et paramètres d'url dans le décorateur django

@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_: 

J'aimerais faire ce qui suit:

Vue:

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

Décorateur:

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 

Quelle est la meilleure façon de s'y prendre pour y parvenir?

Répondre

2

Votre décorateur devrait être comme ça

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 

Si la UserClasses contient la ligne à la fois user et class_id (suppose que user est unique), la fonction de vue sera executed.Otherwise il renvoie une réponse d'erreur (ERREUR: Utilisateur non présent dans la classe).

Et vous affichez la fonction doit être

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

si vous voulez que l'objet class_ dans la fonction de vue, vous pouvez le faire par des changements simples. modifier votre décorateur comme

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 

Et la fonction de vue doit être

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

class_obj contient l'objet class_