Django扩展User模型登录报错:无法解析关键字'username'
Django登录表单报错:Cannot resolve keyword 'username' into field 解决方案
问题描述
使用Profile模型扩展Django默认User模型并添加字段,登录页面可正常加载,但提交表单时出现错误:
Cannot resolve keyword 'username' into field. Choices are: id, profile_image, status, user, user_id
错误原因
- 错误的模型属性设置:Profile模型并非自定义用户模型(未继承
AbstractBaseUser或AbstractUser),却错误添加了USERNAME_FIELD = 'user__username'属性。该属性仅用于自定义用户模型,会导致认证系统错误地尝试在Profile模型中查找username字段,而Profile本身无此字段,最终触发报错。 - 登录表单模型指向错误:登录表单(UserLoginForm)可能错误指定使用Profile模型进行认证,而非默认的User模型。
解决方案
1. 移除Profile模型中的错误属性
修改models.py,删除Profile类内的USERNAME_FIELD = 'user__username'行:
from django.contrib.auth.models import User from django.db import models STATUS_CHOICES = ( ('', 'What is your use of the academy?'), ('student', 'Student'), ('teacher', 'Teacher'), ('author', 'Author'), ) class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) profile_image = models.ImageField(null=True, default='profile.jpg') status = models.CharField( max_length=150, choices=STATUS_CHOICES, default='What is your use of the academy?', ) def __str__(self): return self.user.username
2. 确保登录表单基于User模型
检查forms.py中的UserLoginForm,确保它基于Django默认的AuthenticationForm,认证逻辑指向User模型:
from django.contrib.auth.forms import AuthenticationForm class UserLoginForm(AuthenticationForm): # 可添加自定义样式或字段,但核心认证逻辑沿用默认User模型 class Meta: model = User fields = ['username', 'password']
3. 注册时自动关联Profile
注册用户时,需在User创建完成后自动生成对应的Profile记录,可通过以下两种方式实现:
方法一:重写RegisterView的form_valid方法
修改views.py中的RegisterView:
from django.shortcuts import render from django.urls import reverse_lazy from django.views.generic import CreateView from .forms import RegisterUserForm from django.contrib.auth.models import User from .models import Profile # Create your views here. def profile(request): return render( request, 'common/profile.html' ) class RegisterView(CreateView): form_class = RegisterUserForm success_url = reverse_lazy('login') template_name = 'registration/register.html' def form_valid(self, form): # 先保存User实例 user = form.save() # 为新用户创建Profile Profile.objects.create(user=user) return super().form_valid(form)
方法二:使用Django信号自动创建Profile
在models.py末尾添加信号接收器:
from django.db.models.signals import post_save from django.dispatch import receiver @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) @receiver(post_save, sender=User) def save_user_profile(sender, instance, **kwargs): instance.profile.save()
4. 执行数据库迁移
修改模型后,运行以下命令更新数据库:
python manage.py makemigrations python manage.py migrate
验证
重启Django服务器,重新尝试登录操作,错误应不再出现。
内容的提问来源于stack exchange,提问作者Hamza Waleed
相关产品推荐
相关产品推荐

