2014-02-12 39 views
0

假設我有看法嵌套的裝飾,提高404

def foo(request) 

我還使用自定義的用戶模型如下:

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

我想2個Django的裝飾相結合: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.') 

在我的網址硬編碼。

問題是:我可以在不創建附加視圖並將其添加到URL的情況下執行此操作嗎?有沒有辦法讓'user_passed_test'裝飾器引發404錯誤,而不是重定向到登錄視圖?

可能有一個非常簡單的解決方案,當然我只是想念它。

+0

你說的是兩件事: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

嗯。所以也許我應該把上面寫的裝飾器和'login_required'結合起來? – slnowak