Django注册数据未存入数据库导致无法登录问题求助
问题分析与解决方案
核心问题点
- 视图表单实例化逻辑错误:原代码中POST请求处理后,无论表单是否有效,都会重新实例化空表单,导致错误信息丢失,页面无法反馈问题,也无法保留用户输入内容。
- 自定义User模型字段冲突:AbstractUser已自带
username字段,重复定义该字段会引发底层字段映射冲突,导致数据无法正常存储。 - 注册表单未关联自定义User模型:若
UserRegisterForm未指定使用自定义User模型,表单会默认操作Django内置User模型,数据无法存入自定义表。 - 登录视图的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
相关产品推荐
相关产品推荐

