2013-04-14 27 views
19

view.py如何將視圖限制爲超級用戶?

@login_required 
@permission_required('is_superuser') 
def score_reset(request): 
    pass 

url.py

url(r'^score-reset/$', score_reset, name='score-reset'),  

我有下面的代碼讓我吃驚我還是打的功能,儘管被記錄在與非超級用戶。我期待得到一個許可被拒絕。

我錯過了什麼?

回答

33

is_superuser不是權限,它是用戶模型上的屬性。 Django中已經有另一個decorator you can make use of called user_passes_test執行該檢查:如果你想在衆多的意見進行這樣的檢查

from django.contrib.auth.decorators import user_passes_test 

@user_passes_test(lambda u: u.is_superuser) 
def score_reset(self,...): 
    ... 
+0

順便說一句,我不是標誌着這是因爲無論答案我已經掛一提的是'user_passes_test'是現有的Django裝飾以及一個事實,即'is_superuser重複'不是權限 –

+2

問題只限於超級用戶。示例代碼應該是@user_passes_test(lambda u:u.is_superuser) – mhost

+0

使用'user_passes_test' [上面的代碼片段]完成這項工作。但是您可能想要考慮這將會重定向到所有非超級用戶的登錄頁面,即使他們已經登錄。你可能想編寫自己的裝飾器來完成工作。 – allsyed

1

@user_passes_test不是一個完美的解決方案。 你可以很容易地寫你自己的decorathor例如@staff_member_require。

Here您可以看到其中一種可能的解決方案。

0

以上答案似乎是非常早期的django版本。 它們比稍後版本更復雜

對於django 1.11這裏有點類似但更簡單的策略。

views.py

from django.contrib.auth.decorators import login_required 

@login_required 
def some_view(request): 
if request.user.is_superuser: 
    //allow access only to superuser 
    return render(request, 'app/template1.html', args) 
else: 
    //allow access only to user 
    return render(request, 'app/template2.html', args) 
相關問題