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

Django自定义User模型无法登录,仅auth_user账号可正常登录求助

解决方案

1. 配置Django使用自定义用户模型

在项目根目录的settings.py中添加以下配置,告知Django使用你自定义的用户模型:

AUTH_USER_MODEL = 'function.User'

注意:该配置必须在首次执行数据库迁移前设置。如果已经生成过迁移文件,需要删除应用migrations目录下除__init__.py外的所有文件,然后重新执行python manage.py makemigrations和python manage.py migrate,否则Django会继续沿用默认的auth_user数据表。

2. 自定义登录表单

默认的AuthenticationForm是基于Django内置User模型开发的,无法适配你的自定义模型。在应用的forms.py中创建自定义登录表单:

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

class CustomAuthenticationForm(AuthenticationForm):
    class Meta:
        model = User
        fields = ('username', 'password')

3. 修正登录视图逻辑

原视图存在两个问题:GET请求时错误传入空的request.POST初始化表单,以及使用默认表单无法识别自定义用户。修改后的视图如下:

from django.contrib import auth
from django.http import HttpResponseRedirect
from django.shortcuts import render 
from .forms import CustomAuthenticationForm

def log_in(request):
    # GET请求时初始化空表单
    form = CustomAuthenticationForm()
    if request.method == "POST":
        form = CustomAuthenticationForm(data=request.POST)
        if form.is_valid():
            # 通过表单获取已验证的用户对象
            user = form.get_user()
            if user.is_active:
                auth.login(request, user)
                return HttpResponseRedirect('/index')
    context = {
        'form': form,
    }   
    return render(request, 'login.html', context)

4. 确认用户管理器的完整性

自定义用户模型必须搭配实现了create_user和create_superuser方法的管理器,确保你的AccountManager类代码如下:

from django.contrib.auth.models import BaseUserManager

class AccountManager(BaseUserManager):
    def create_user(self, username, email, date_of_birth, password=None):
        if not email:
            raise ValueError('用户必须填写邮箱')
        if not username:
            raise ValueError('用户必须填写用户名')
        
        user = self.model(
            email=self.normalize_email(email),
            username=username,
            date_of_birth=date_of_birth,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, email, date_of_birth, password):
        user = self.create_user(
            username=username,
            email=email,
            password=password,
            date_of_birth=date_of_birth,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user

问题根源

你遇到的核心问题是未告知Django使用自定义用户模型,导致auth模块默认去auth_user表查询用户,而你的自定义账号存储在function_user表中,自然无法匹配。配置AUTH_USER_MODEL后,所有auth相关操作都会转向你的自定义模型,结合适配的登录表单,就能实现自定义账号的正常登录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:20:24