2013-04-14 31 views
19

view.pyLàm cách nào để giới hạn chế độ xem chỉ dành cho siêu người dùng?

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

url.py

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

Tôi có đoạn code sau và trước sự ngạc nhiên của tôi, tôi vẫn nhấn chức năng, dù đã được đăng nhập với một tổ chức phi superuser. Tôi đã mong đợi để có được một sự cho phép từ chối.

Tôi đang thiếu gì?

Trả lời

33

is_superuser không phải là quyền, đó là thuộc tính trên mô hình người dùng. Django đã có một decorator you can make use of called user_passes_test để thực hiện việc kiểm tra này:

from django.contrib.auth.decorators import user_passes_test 

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

btw, tôi không đánh dấu này là trùng lặp như không phải câu trả lời tôi đã liên kết kể rằng 'user_passes_test' là một nhà thiết django hiện có cũng như thực tế rằng' is_superuser 'không phải là sự cho phép –

+2

Câu hỏi yêu cầu chỉ giới hạn cho người siêu người dùng. Mã ví dụ phải là @user_passes_test (lambda u: u.is_superuser) – mhost

+0

Sử dụng 'user_passes_test' [đoạn mã trên] thực hiện công việc.Nhưng bạn có thể muốn xem xét điều này sẽ chuyển hướng đến trang đăng nhập cho tất cả người dùng không phải là siêu người dùng, ngay cả khi họ đã đăng nhập. Bạn có thể muốn viết trang trí của riêng bạn để hoàn thành công việc. – allsyed

1

@user_passes_test không phải là một giải pháp thanh lịch nếu bạn muốn thực hiện việc kiểm tra này trên nhiều lượt xem. Bạn có thể dễ dàng viết trình trang trí riêng của mình, ví dụ như @staff_member_require.

Here bạn có thể thấy một trong các giải pháp khả thi.

0

Câu trả lời ở trên dường như dành cho các phiên bản django rất sớm. Chúng phức tạp hơn một chút so với phiên bản sau

cho django 1.11 đây là một chiến lược tương tự nhưng đơn giản hơn.

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) 
Các vấn đề liên quan