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

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

错误原因

  1. 错误的模型属性设置:Profile模型并非自定义用户模型(未继承AbstractBaseUser或AbstractUser),却错误添加了USERNAME_FIELD = 'user__username'属性。该属性仅用于自定义用户模型,会导致认证系统错误地尝试在Profile模型中查找username字段,而Profile本身无此字段,最终触发报错。
  2. 登录表单模型指向错误:登录表单(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:05:22