2015-04-16 21 views
6

Tôi đang cố gắng kiểm tra các điều kiện nhất định trước khi người dùng được phép xem trang cài đặt người dùng cụ thể. Tôi đang cố gắng để đạt được điều này bằng cách sử dụng trang trí user_passes_test. Hàm này nằm trong khung nhìn dựa trên lớp như sau. Tôi đang sử dụng phương pháp trang trí để trang trí hàm get_initial trong khung nhìn.Cách sử dụng trình trang trí user_passes_test trong chế độ xem dựa trên lớp học?

class UserSettingsView(LoginRequiredMixin, FormView): 
    success_url = '.' 
    template_name = 'accts/usersettings.html' 

    def get_form_class(self): 
     if self.request.user.profile.is_student: 
      return form1 
     if self.request.user.profile.is_teacher: 
      return form2 
     if self.request.user.profile.is_parent: 
      return form3 

    @method_decorator(user_passes_test(test_settings, login_url='/accounts/usertype/')) 
    def get_initial(self): 
     if self.request.user.is_authenticated(): 
      user_obj = get_user_model().objects.get(email=self.request.user.email) 
      if user_obj.profile.is_student: 
       return { .......... 
     ...... .... 

Dưới đây là test_settings chức năng:

def test_settings(user): 
    print "I am in test settings" 
    if not (user.profile.is_student or user.profile.is_parent or user.profile.is_teacher): 
     return False 
    else: 
     return True 

Tôi nhận được lỗi dưới đây với các trang trí.

File "../django/core/handlers/base.py", line 111, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "../django/views/generic/base.py", line 69, in view 
    return self.dispatch(request, *args, **kwargs) 
File "../braces/views.py", line 107, in dispatch 
    request, *args, **kwargs) 
File "../django/views/generic/base.py", line 87, in dispatch 
    return handler(request, *args, **kwargs) 
File "../django/views/generic/edit.py", line 162, in get 
    form = self.get_form(form_class) 
File "../django/views/generic/edit.py", line 45, in get_form 
    return form_class(**self.get_form_kwargs()) 
File "../django/views/generic/edit.py", line 52, in get_form_kwargs 
    'initial': self.get_initial(), 
File "../django/utils/decorators.py", line 29, in _wrapper 
    return bound_func(*args, **kwargs) 
TypeError: _wrapped_view() takes at least 1 argument (0 given) 

Tôi không chắc chắn cách giải quyết lỗi này. Tôi có áp dụng công cụ trang trí sai chức năng không? Bất kỳ khách hàng tiềm năng nào đều hữu ích.

Trả lời

14

Django 1.9 có hỗn hợp xác thực cho chế độ xem dựa trên lớp học. Bạn có thể sử dụng kết hợp UserPassesTest như sau.

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin 

class UserSettingsView(LoginRequiredMixin, UserPassesTestMixin, View): 
    def test_func(self): 
     return test_settings(self.request.user) 

    def get_login_url(self): 
     if not self.request.user.is_authenticated(): 
      return super(UserSettingsView, self).get_login_url() 
     else: 
      return '/accounts/usertype/' 

Lưu ý rằng trong trường hợp này bạn cần phải ghi đè get_login_url, bởi vì bạn muốn chuyển hướng đến một url khác nhau tùy thuộc vào việc người dùng không đăng nhập, hoặc đăng nhập nhưng không kiểm tra.

Đối với Django 1.8 trở về trước, bạn nên trang trí phương thức dispatch, không phải get_initial.

@method_decorator(user_passes_test(test_settings, login_url='/accounts/usertype/')) 
def dispatch(self, *args, **kwargs): 
    return super(UserSettingsView, self).dispatch(*args, **kwargs) 
+0

OK. cảm ơn! – pxUx

+0

Ví dụ của bạn đọc rằng nếu người dùng được xác thực thì hãy trả lại url đăng nhập. Nên nếu/else được đổi chỗ? – pymarco

+0

@pymarco vị trí tốt, cố định ngay bây giờ – Alasdair

Các vấn đề liên quan