Có trình trang trí nào trong django tương tự như @login_required cũng kiểm tra xem người dùng có phải là siêu người dùng không?
Cảm ơn
Có trình trang trí nào trong django tương tự như @login_required cũng kiểm tra xem người dùng có phải là siêu người dùng không?
Cảm ơn
Câu trả lời:
Sử dụng trình user_passes_test
trang trí:
from django.contrib.auth.decorators import user_passes_test
@user_passes_test(lambda u: u.is_superuser)
def my_view(request):
...
@staff_member_required
thêm vào @user_passes_test
.
Trong trường hợp số lượng nhân viên là đủ và bạn không cần phải kiểm tra xem người dùng có phải là siêu người dùng hay không, bạn có thể sử dụng trình @staff_member_required
trang trí:
from django.contrib.admin.views.decorators import staff_member_required
@staff_member_required
def my_view(request):
...
Nếu bạn muốn có chức năng tương tự như @staff_member_required, bạn có thể dễ dàng viết trình trang trí của riêng mình. Lấy @staff_member làm ví dụ, chúng ta có thể làm điều gì đó như sau:
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.admin.views.decorators import user_passes_test
def superuser_required(view_func=None, redirect_field_name=REDIRECT_FIELD_NAME,
login_url='account_login_url'):
"""
Decorator for views that checks that the user is logged in and is a
superuser, redirecting to the login page if necessary.
"""
actual_decorator = user_passes_test(
lambda u: u.is_active and u.is_superuser,
login_url=login_url,
redirect_field_name=redirect_field_name
)
if view_func:
return actual_decorator(view_func)
return actual_decorator
Ví dụ này là một staff_member_required đã được sửa đổi, chỉ cần thay đổi một lần kiểm tra trong lambda.
from django.contrib.auth import REDIRECT_FIELD_NAME
Đối với các chế độ xem dựa trên lớp, việc tạo trình trang trí có thể sử dụng lại:
from django.contrib.auth.mixins import UserPassesTestMixin
from django.views.generic import View
def superuser_required():
def wrapper(wrapped):
class WrappedClass(UserPassesTestMixin, wrapped):
def test_func(self):
return self.request.user.is_superuser
return WrappedClass
return wrapper
@superuser_required()
class MyClassBasedView(View):
def get(self, request):
# ...
Tôi khuyên bạn nên sử dụng Mixins, ví dụ:
from django.contrib.auth.mixins import UserPassesTestMixin
class SuperUserCheck(UserPassesTestMixin, View):
def test_func(self):
return self.request.user.is_superuser
Sau đó, bạn có thể thêm SuperUserCheck
vào View
lớp:
class MyView(SuperUserCheck, View):
Để yêu cầu một siêu người dùng trên chế độ xem dựa trên lớp mà không cần viết mã mới:
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import user_passes_test
@method_decorator(user_passes_test(lambda u: u.is_superuser), name='dispatch')
class AdminCreateUserView(LoginRequiredMixin, FormView):
...
...
...