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

Django注册数据未存入数据库导致无法登录问题求助

问题分析与解决方案

核心问题点

  1. 视图表单实例化逻辑错误:原代码中POST请求处理后,无论表单是否有效,都会重新实例化空表单,导致错误信息丢失,页面无法反馈问题,也无法保留用户输入内容。
  2. 自定义User模型字段冲突:AbstractUser已自带username字段,重复定义该字段会引发底层字段映射冲突,导致数据无法正常存储。
  3. 注册表单未关联自定义User模型:若UserRegisterForm未指定使用自定义User模型,表单会默认操作Django内置User模型,数据无法存入自定义表。
  4. 登录视图的authenticate参数错误:authenticate默认接收username和password参数,你的USERNAME_FIELD是email,需用email作为username参数传入,而非直接传email=email。

修复后的代码

1. 修正models.py

去掉重复定义的username字段,复用AbstractUser自带字段:

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    email = models.EmailField(unique=True, null=False)
    dob = models.DateField(null=True, blank=True)
    mobile_number = models.CharField(max_length=10, null=True, blank=True)

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ['username']

    def __str__(self):
        return self.username

2. 定义正确的UserRegisterForm(forms.py)

确保表单关联自定义User模型:

from django.contrib.auth.forms import UserCreationForm
from .models import User

class UserRegisterForm(UserCreationForm):
    class Meta:
        model = User
        fields = ['email', 'username', 'password1', 'password2']

3. 修正register视图

调整表单实例化逻辑,避免覆盖错误信息,优化登录逻辑:

def register(request):
    form = UserRegisterForm()
    if request.method == "POST":
        print("method is post")
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            print("form is valid")
            user = form.save()
            username = form.cleaned_data.get("username")
            messages.success(request, f"hey {username}, account created successfully")
            # 直接用保存的用户登录,无需再次authenticate
            login(request, user)
            return redirect("jew_app:home")
        else:
            print(form.errors)
    
    context = {'form': form}
    return render(request, 'user/register.html', context)

4. 修正user_login视图

修正authenticate的参数传递:

def user_login(request):
    if request.user.is_authenticated:
        messages.warning(request, f"Hey you are already logged in")
        return redirect("accounts:profile")

    if request.method == "POST":
        email = request.POST.get("email")
        password = request.POST.get("password")

        try:
            user = User.objects.get(email=email)
            user = authenticate(request, username=email, password=password)

            if user is not None:
                login(request, user)
                messages.success(request, "You are logged in")
                return redirect("jew_app:home")
            else:
                messages.warning(request, "密码错误,请重新输入")

        except User.DoesNotExist:
            messages.warning(request, f"User with {email} does not exist")

    return render(request, 'user/login.html', {})

额外检查项

  • 确保settings.py中配置自定义User模型:AUTH_USER_MODEL = 'your_app_name.User'(替换your_app_name为你的应用名称)
  • 注册模板需正确渲染表单字段与错误信息:
<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">注册</button>
</form>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:52:40