2013-02-23 6 views
1

Модель Project с отношением ManyToMany к модели User, используя таблицу соединений. Если пользователь не является участником проекта (а не в таблице соединений), я хочу, чтобы пользователь не получал доступ к представлению, показывающему конкретный проект.Django custom decorator для пользовательского разрешения

Я знаю, что он может быть разрешен с помощью простого оператора if внутри метода представления или настраиваемого фильтра в шаблоне, но я хотел бы иметь возможность сделать это с помощью специального декоратора. Возможно ли это? Если да, то как это можно сделать?

Что-то вроде:

def may_user_view_this(function): 
    def wrapper(request, *args, **kwargs): 
     user = request.user 
     project = Project.objects.get(id=???????) #id 
     if not project.has_user(user): 
      return HttpResponse('You cannot view this.') 
     else: 
      return function(request, *args, **kwargs) 
    return wrapper 


@may_user_view_this() # if not go the specific url 
def my_view(request, page_id=None): 
    # do stuff and render 

Как я могу получить доступ к параметру page_id отправляется my_view из функции декоратора?

+0

Да, это возможно. –

ответ

2

Конечно, это возможно, это то, что предназначены для декораторов.

+0

И как это должно быть сделано? Мне нужно получить доступ к параметрам и т. Д. – user1121487

+0

Хорошее место для начала было бы взглянуть на декоратор @login_required в Django – Brandon

+0

Хорошо. Я все понимаю, кроме; как мне получить параметр «page_id» внутри метода декоратора? – user1121487