2014-02-12 3 views
0

Предположат, что я имею видВложенные декораторы, воспитывающие 404

def foo(request) 

Я также использую пользовательскую модель пользователя следующим образом:

class MyUser(AbstractUser): 
    field = models.BooleanField() 

Я хотел бы объединить 2 Джанго декораторов: login_required и user_passed_test , так что анонимный пользователь должен быть перенаправлен на страницу входа, а пользователь, которому не разрешено видеть представление (user.field == False), должен увидеть правильное сообщение (скажем, что-то вроде «вам не разрешено видеть это»,).

Так что я пробовал:

my_decor = user_passes_test(lambda user: user.field == True, 
         login_url='/bar') 


def custom_decor(view_func): 
    decorated_view_func = login_required(my_decor(view_func), login_url='/login') 
    return decorated_view_func 

И я также должен определить вид:

def bar(request): 
    return HttpResponse('you are not allowed to see this context.') 

и жёстко его в моих URLs.

Вопрос: могу ли я сделать это, не создавая дополнительный вид и добавляя его к URL-адресам? Есть ли способ сделать «user_passed_test» декоратор, повышающий ошибку 404 вместо перенаправления на просмотр входа?

Возможно, это очень простое решение, и, конечно же, я просто пропустил его.

+0

Вы говорите о 2 вещи: 1. сочетающие 2 декораторов и 2. изменяя свое поведение, чтобы повысить 404 вместо перенаправления. Что касается сочетания, я думаю, вы абсолютно правы. – glglgl

ответ

0

Я не очень хорошо помню синтаксис декораторов, но вы можете сделать:

def custom_decor(view_func): 
    def decorator(request, *args, **kwargs) 
     if request.user.field is True: 
      return view_func(request, *arg, **kwargs) 
     raise Http404 

    return decorator 

так ...

@login_required(login_url='/login') 
@custom_decor 
def foo(request) 
    # ... 
+0

Этот ответ правильный, но бесполезный. OP хочет их комбинировать, и AFAICT он делает это точно так же, как и .... – glglgl

+0

Hm. Так что, может быть, я должен объединить декоратор, написанный выше, с помощью «login_required»? – slnowak

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