Python django-使用django.test.Client对用户进行身份验证

Python django-使用django.test.Client对用户进行身份验证,python,django,Python,Django,在我的测试中,我试图创建并验证一个用户,但当我点击我的视图时,它仍然返回302 def test_Home(self): self.client = Client() self.user = User.objects.create_user("xoxo", password="bar", is_staff=True) self.logged_in = self.client.login( username="xoxo", password="bar")

在我的测试中,我试图创建并验证一个用户,但当我点击我的视图时,它仍然返回302

def test_Home(self):
    self.client = Client()
    self.user = User.objects.create_user("xoxo", password="bar", is_staff=True)
    self.logged_in = self.client.login(
        username="xoxo", password="bar")
    r = self.client.get('/hudson/')
    self.assertEqual(r.status_code, HTTP_200_OK)
我的
/hudson/
视图很简单:

class HomeView(PermissionRequiredMixin, generic.TemplateView):
    template_name = 'foo/base.html'
    permission_required = ('user.is_staff', )
    login_url = reverse_lazy('admin:login')

我的
管理员/登录名获得了302,如视图中定义的那样

用户
实例上的属性,而不是权限。您被重定向,因为用户没有权限
“user.is\u staff”

您可以使用mixin来代替:

from django.contrib.auth.mixins import UserPassesTestMixin

class HomeView(UserPassesTestMixin, generic.TemplateView):
    def test_func(self):
        return self.request.user.is_staff 

    template_name = 'foo/base.html'
    login_url = reverse_lazy('admin:login')
如果在多个视图中执行此操作,则可以创建自己的mixin

class UserIsStaffMixin(UserPassesTestMixin):
    def test_func(self):
        return self.request.user.is_staff 

    login_url = reverse_lazy('admin:login')

class HomeView(UserIsStaffMixin, generic.TemplateView):
    template_name = 'foo/base.html'

你的意思是我必须改变我的观点以适应测试?我在所有视图中都使用此模板,在每个视图中添加test_func似乎很愚蠢。难道没有更好的方法吗?这不是为了适应测试,而是为了修正视图。没有权限
user.is\u staff
(除非您手动创建了它),因此您不能使用
PermissionRequiredMixin
检查它。。如果您不想在多个视图中定义相同的
test_func
,那么请创建您自己的mixin。恭喜,您的测试发现了一个bug!在Django?:微笑:在我的代码里皱眉: