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

Django待办应用邮箱注册登录报错:core_user表不存在求助

解决Django注册时core_user表不存在的问题及邮箱密码登录实现

一、修复core_user表不存在的错误

  1. 确认自定义用户模型配置
    • 若使用自定义用户模型,必须在settings.py中指定AUTH_USER_MODEL:
      # settings.py
      AUTH_USER_MODEL = 'core.User'
      
    • 确保core应用已加入INSTALLED_APPS:
      INSTALLED_APPS = [
          # 其他内置/第三方应用
          'core',
      ]
      
  2. 执行数据库迁移
    • 若先定义了自定义用户模型再初始化迁移,直接运行:
      python manage.py makemigrations core
      python manage.py migrate
      
    • 注意:如果是项目中途修改用户模型,需清空现有数据库(如删除db.sqlite3)后重新执行迁移,Django不支持中途替换默认用户模型。
  3. 检查自定义用户模型定义
    确保core/models.py中的用户模型正确继承基类并配置管理器:
    # core/models.py
    from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
    from django.db import models
    
    class UserManager(BaseUserManager):
        def create_user(self, email, password=None, **extra_fields):
            if not email:
                raise ValueError('必须提供邮箱地址')
            email = self.normalize_email(email)
            user = self.model(email=email, **extra_fields)
            user.set_password(password)
            user.save(using=self._db)
            return user
    
        def create_superuser(self, email, password=None, **extra_fields):
            extra_fields.setdefault('is_staff', True)
            extra_fields.setdefault('is_superuser', True)
            return self.create_user(email, password, **extra_fields)
    
    class User(AbstractBaseUser, PermissionsMixin):
        email = models.EmailField(unique=True)
        is_active = models.BooleanField(default=True)
        is_staff = models.BooleanField(default=False)
    
        objects = UserManager()
    
        USERNAME_FIELD = 'email'
        REQUIRED_FIELDS = []
    

二、实现邮箱密码注册登录功能

1. 注册视图

# core/views.py
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from .forms import UserRegistrationForm

def register(request):
    if request.method == 'POST':
        form = UserRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            email = form.cleaned_data.get('email')
            password = form.cleaned_data.get('password1')
            user = authenticate(email=email, password=password)
            login(request, user)
            return redirect('todo_list')  # 替换为你的首页路由名称
    else:
        form = UserRegistrationForm()
    return render(request, 'core/register.html', {'form': form})

2. 注册表单

# core/forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import User

class UserRegistrationForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('email',)

3. 登录视图

# core/views.py
def user_login(request):
    if request.method == 'POST':
        email = request.POST.get('email')
        password = request.POST.get('password')
        user = authenticate(request, email=email, password=password)
        if user is not None:
            login(request, user)
            return redirect('todo_list')
        else:
            return render(request, 'core/login.html', {'error': '邮箱或密码错误'})
    return render(request, 'core/login.html')

4. 注册模板示例(register.html)

<!-- templates/core/register.html -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">完成注册</button>
</form>

5. 路由配置

# core/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('register/', views.register, name='register'),
    path('login/', views.user_login, name='login'),
]

三、注意事项

  • 所有需要引用用户模型的代码,统一使用get_user_model()而非直接导入:
    from django.contrib.auth import get_user_model
    User = get_user_model()
    
  • 若之前运行过默认用户模型的迁移,必须清空数据库后重新执行迁移,否则会出现表结构冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:22:47