问题描述
在尝试允许用户查看特定用户设置页面之前,我正在尝试检查某些条件。我正在尝试使用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装饰器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!