You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django登录表单始终返回‘inactive user’错误如何修复?

修复Django登录提示“该用户账户已停用”的问题

问题根源

你遇到的登录时始终返回“该用户账户已停用”的问题,核心来自以下几处代码错误:

1. 登录表单UserLoginForm的逻辑冲突

  • 继承AuthenticationForm后无需添加Meta类,父类本身已封装完整的认证逻辑,自定义Meta会干扰原有验证流程
  • Meta里的password1是注册表单专用字段,登录场景应使用password,字段名错误会导致表单无法正确获取密码,触发父类内置的“账户未激活”错误提示
  • 重复定义username和password字段,会和父类字段产生冲突,打乱验证逻辑

2. 登录视图的authenticate参数错误

  • settings.AUTHENTICATION_BACKEND是错误的配置项,正确配置为settings.AUTHENTICATION_BACKENDS(复数形式),直接传字符串格式的后端路径无法正确加载认证后端,导致authenticate返回None,进而触发错误提示
  • get方法中form = self.form_class未实例化表单,会导致模板渲染异常

修复步骤

1. 修正登录表单UserLoginForm

删除多余的Meta类,保留自定义样式即可,推荐用__init__方法修改字段属性,避免和父类冲突:

from django.contrib.auth.forms import AuthenticationForm
from django import forms

class UserLoginForm(AuthenticationForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['username'].widget.attrs.update({'class': 'form-control'})
        self.fields['username'].label = 'Ваш логін'
        self.fields['password'].widget.attrs.update({'class': 'form-control'})
        self.fields['password'].label = 'Ваш пароль'

2. 修正登录视图的逻辑

  • 修复authenticate调用,移除错误的backend参数(Django会自动使用配置的认证后端)
  • 补全表单实例化的括号:
def get(self, request):
    form = self.form_class()  # 实例化表单
    return render(request, 'users_logic/user_login.html', {'form': form})

def post(self, request):
    form = self.form_class(request.POST)
    if form.is_valid():
        username = form.cleaned_data.get('username')
        password = form.cleaned_data.get('password')
        # 移除错误的backend参数,让Django自动处理认证后端
        user = authenticate(username=username, password=password)
        print(user)
        if user is not None:
            login(request, user)
            print(user)
            messages.success(request, 'Ви успішно авторизувались')
            return redirect('main_page')
        else:
            messages.error(request, 'Помилка авторизації')
    else:
        messages.error(request, 'Неправильний логін або пароль')
        print(form.errors)  # 打印具体错误,而非error_messages
    return render(request, 'users_logic/user_login.html', {'form': form})

3. 确保用户注册后处于激活状态(可选)

如果以上修复后问题仍存在,检查注册用户的is_active字段,在注册视图中强制激活用户:

class SignUp(generic.CreateView):
    template_name = 'users_logic/user_register.html'
    form_class = UserRegisterForm
    success_url = reverse_lazy('user_login')
    success_message = "Реєстрація пройшла успішно"

    def form_valid(self, form):
        user = form.save(commit=False)
        user.is_active = True  # 强制设置用户为激活状态
        user.save()
        return super().form_valid(form)

内容的提问来源于stack exchange,提问作者Dimaapp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:57:41