2012-01-27 3 views
3

У меня есть следующий декоратор и представление, которое отлично работает.Django добавить дополнительные аргументы в декоратор

декоратор

def event_admin_only(func): 
    """ 
    Checks if the current role for the user is an Event Admin or not 
    """ 
    def decorator(request, *args, **kwargs): 
     event = get_object_or_404(Event, slug=kwargs['event_slug']) 

     allowed_roles = [role[1] for role in Role.ADMIN_ROLES] 

     # get user current role 
     current_role = request.session.get('current_role') 

     if current_role not in allowed_roles: 
      url = reverse('no_perms') 
      return redirect(url) 
     else:  
      return func(request, *args, **kwargs) 
    return decorator 

Посмотреть

@event_admin_only 
def event_dashboard(request, event_slug: 

Но как я могу изменить мой декоратора таким образом, что он принимает в качестве дополнительного параметра следующим образом:

@event_admin_only(obj1,[...]) 
def event_dashboard(request, event_slug: 
+1

Возможный дубликат [Как создать декоратор Python, который может использоваться как с параметрами, так и без них?] (Http://stackoverflow.com/questions/653368/how-to-create-a-python-decorator- который может быть использован-либо-с-или-без-параметров) – DrTyrsa

ответ

8

Вы необходимость обернуть создание функции декоратора в другой функции:

def the_decorator(arg1, arg2): 

    def _method_wrapper(view_method): 

     def _arguments_wrapper(request, *args, **kwargs) : 
      """ 
      Wrapper with arguments to invoke the method 
      """ 

      #do something with arg1 and arg2 

      return view_method(request, *args, **kwargs) 

     return _arguments_wrapper 

    return _method_wrapper 

Это то можно назвать так:

@the_decorator("an_argument", "another_argument") 
def event_dashboard(request, event_slug): 

Я настоятельно рекомендую ответ от электронной Satis по этому вопросу, чтобы понять это: How to make a chain of function decorators?

+0

Этот код не работает как есть, «я» не определено и его необходимо удалить. –

+0

Ах да. Обновлено - спасибо! –

Смежные вопросы