无法在Django中更改用户的is_active状态

时间:2019-03-01 05:04:45

标签: python django

我正在使用webapp,其中域的管理员要执行的任务是注册与其域相同的其他用户。当我单击授权时,无法授权用户。

这是我的 forms.py

class AuthUserCheckbox(forms.Form):

    choice = forms.MultipleChoiceField(choices=[], widget=forms.CheckboxSelectMultiple, required=True)

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        user_email = self.user.email.split('@')[1]
        super(AuthUserCheckbox, self).__init__(*args, **kwargs)
        self.fields['choice'] = forms.MultipleChoiceField(choices=[(i.id, i.email)
                                                          for i in User.objects.filter(is_active=False, email__icontains=user_email)])

这是我的 views.py

@login_required
def authorize_final(request):
    if request.method == 'POST':
        authorize_users = AuthUserCheckbox(data=request.POST, user=request.user)
        if authorize_users.is_valid():
            email_list = authorize_users.cleaned_data.get('choice[]')
            for i in email_list:
                if i.is_active == False:
                    i.is_active = True
                    return HttpResponse('<h3>Authorized successfully</h1>')
        else:
            return HttpResponse('<h3>Authorization failed</h3>')
    else:
        return HttpResponse('<h3>Post request error</h3>')

2 个答案:

答案 0 :(得分:0)

尝试

 authorize_users = AuthUserCheckbox(data=request.POST, user=request.user.username)

答案 1 :(得分:0)

代码存在一些问题。

首先,您遇到的错误是由于语法问题。另外,您将User.objects.all()视为普通列表,不需要使用。您可以像以下代码一样直接使用queryset

    user_email = self.user.email.split('@')[1]
    super(AuthUserCheckbox, self).__init__(*args, **kwargs)
    self.fields['choice'].choices = [(i.id, i.email) for i in User.objects.filter(is_active=False, email__icontains=user_email)])

在这里,我直接查询用户的电子邮件中是否存在电子邮件域,并检查用户是否为活动用户或节点。

第二,在视图中,您可以像这样访问表单cleaned data中的选项:

authorize_users = AuthUserCheckbox(data=request.POST, user=request.user)
if authorize_users.is_valid():
    email_list = authorize_users.cleaned_data.get('choice')
    User.objects.filter(pk__in=email_list).update(active=True)