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

Django自定义Worker用户登录报错:用户名已存在问题求助

解决登录时出现"A user with that username already exists"错误的方案

错误根源

你在登录视图中误用了注册用的UserForm——这个表单是为创建新用户设计的,自带username字段的唯一性校验逻辑,登录时提交已存在的用户名,必然触发该错误。

具体解决步骤

1. 确保登录表单是专用的

你已经写了UserLoginForm,要确保它只负责登录验证,不包含用户创建的逻辑。示例写法:

from django import forms

class UserLoginForm(forms.Form):
    username = forms.CharField(label="用户名", max_length=150)
    password = forms.CharField(label="密码", widget=forms.PasswordInput)

注:不要继承ModelForm(注册用的UserForm应该是继承ModelForm),登录表单用普通Form即可,避免自带模型校验规则。

2. 修改登录视图逻辑

把视图里的UserForm替换成UserLoginForm,并使用Django内置的身份验证方法完成登录,再处理Worker关联和页面跳转:

from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from .forms import UserLoginForm
from .models import Worker

def loginUser(request):
    if request.method == 'POST':
        form = UserLoginForm(request.POST)
        if form.is_valid():
            # 提取表单数据
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            
            # 验证用户身份
            user = authenticate(request, username=username, password=password)
            
            if user:
                login(request, user)
                # 查询关联的Worker对象
                try:
                    worker = Worker.objects.get(user=user)
                    # 根据manager字段跳转对应页面
                    return redirect('admin_page' if worker.manager else 'user_page')
                except Worker.DoesNotExist:
                    # 无关联Worker,登出并返回登录页
                    logout(request)
                    return render(request, 'login.html', {
                        'form': form,
                        'error': '该账号未绑定Worker信息,请联系管理员'
                    })
            else:
                # 账号密码错误
                return render(request, 'login.html', {
                    'form': form,
                    'error': '用户名或密码不正确'
                })
    else:
        form = UserLoginForm()
    
    return render(request, 'login.html', {'form': form})

3. 检查登录模板

确保模板中只渲染UserLoginForm的字段,不要包含注册时的额外字段(如fullname、branch等),示例模板片段:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    {% if error %}
        <p style="color: red;">{{ error }}</p>
    {% endif %}
    <button type="submit">登录</button>
</form>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:00:06