本文介绍了如何在基于类的视图中使用user_passes_test装饰器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在尝试允许用户查看特定用户设置页面之前,我正在尝试检查某些条件。我正在尝试使用user_passes_test装饰器来实现此目的。该函数位于基于类的视图中,如下所示。我正在使用方法装饰器来装饰视图中的get_initial函数。

I am trying to check certain conditions before the user is allowed to see a particular user settings page. I am trying to achieve this using the user_passes_test decorator. The function sits in a class based view as follows. I am using method decorator to decorate the get_initial function in the view.

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 { ..........
       ...... .... 

下面是test_settings函数:

Below is the test_settings function:

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

我在装饰器中遇到以下错误。

I am getting the below error with the decorator.

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)

我不确定如何解决此错误。我在错误的功能上应用了装饰器吗?任何线索都将有所帮助。

I am not sure how to resolve this error. Am I applying the decorator on the wrong function? Any leads will be helpful.

推荐答案

Django 1.9具有用于基于类的视图的身份验证混合。您可以使用混合如下。

Django 1.9 has authentication mixins for class based views. You can use the UserPassesTest mixin as follows.

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/'

请注意,在这种情况下,您必须覆盖,因为您想重定向到其他网址

Note that in this case you have to override get_login_url, because you want to redirect to a different url depending on whether the user is not logged in, or is logged in but fails the test.

对于Django 1.8及更早版本,您应该修饰,具体取决于用户是否已登录。调度方法,而不是 get_初始

For Django 1.8 and earlier, you should decorate the dispatch method, not 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)

这篇关于如何在基于类的视图中使用user_passes_test装饰器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-13 13:16