Không, bạn không thể chuyển yêu cầu đến user_passes_test
. Để hiểu lý do tại sao và làm thế nào nó hoạt động, chỉ cần đi qua các source:
def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
"""
Decorator for views that checks that the user passes the given test,
redirecting to the log-in page if necessary. The test should be a callable
that takes the user object and returns True if the user passes.
"""
def decorator(view_func):
@wraps(view_func, assigned=available_attrs(view_func))
def _wrapped_view(request, *args, **kwargs):
if test_func(request.user):
return view_func(request, *args, **kwargs)
path = request.build_absolute_uri()
# If the login url is the same scheme and net location then just
# use the path as the "next" url.
login_scheme, login_netloc = urlparse.urlparse(login_url or
settings.LOGIN_URL)[:2]
current_scheme, current_netloc = urlparse.urlparse(path)[:2]
if ((not login_scheme or login_scheme == current_scheme) and
(not login_netloc or login_netloc == current_netloc)):
path = request.get_full_path()
from django.contrib.auth.views import redirect_to_login
return redirect_to_login(path, login_url, redirect_field_name)
return _wrapped_view
return decorator
Đây là mã đằng sau user_passes_test
trang trí. Như bạn có thể thấy, hàm kiểm tra được truyền cho trình trang trí (trong trường hợp của bạn, lambda u: has_add_permission(u, "project")
) chỉ được chuyển một đối số, request.user
. Bây giờ, tất nhiên là có thể viết trình trang trí của riêng bạn (thậm chí sao chép mã này trực tiếp và chỉ sửa đổi nó) để tự vượt qua request
, nhưng bạn không thể làm điều đó với việc thực thi user_passes_test
mặc định.
Nguồn
2012-08-08 20:48:37
Tôi tò mò, làm thế nào bạn kết thúc việc này? Bạn đã viết trang trí của riêng bạn? – teewuane
Thay vì sử dụng trang trí, tôi đang kiểm tra quyền trong chính mã xem. Nó giúp tôi kiểm soát tốt hơn logic xem. –
Đó cũng là những gì tôi đã làm. Cảm ơn! – teewuane