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

Django中扩展User模型添加自定义字段及视图表单实现的最佳方法是什么

扩展Django User模型的最佳实现方案

当前Django官方对于新项目的推荐方案是继承AbstractUser自定义用户模型,刚好可以解决你提到的一对一关联需要后续补录信息的问题,所有字段可以在注册时一次性收集完成,调用也更方便。

步骤1:修改models.py自定义用户模型

替换原有的User导入,继承AbstractUser添加自定义字段:

from django.db import models
from django.contrib.auth.models import AbstractUser

# 自定义用户模型
class User(AbstractUser):
    # first_name、last_name、email字段AbstractUser已经内置,无需重复定义
    id_card = models.CharField(max_length=18, verbose_name="身份证号", unique=True)
    # 可按需添加其他自定义字段

class Task(models.Model):
    # 这里的User指向上面自定义的模型,原有逻辑不变
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    title = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)
    complete = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self) :
        return self.title
    
    class Meta:
        ordering = ['complete']

步骤2:修改settings.py指定自定义用户模型

在todo_list/settings.py中添加如下配置,告诉Django使用你自定义的用户模型:

# 放在STATIC_URL上方即可
AUTH_USER_MODEL = 'base.User'
LOGIN_URL = 'login'

步骤3:自定义注册表单

在base目录下新建forms.py文件,编写适配自定义用户模型的注册表单:

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

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = User
        # 这里定义注册表单需要展示、提交的字段
        fields = ('username', 'password1', 'password2', 'email', 'first_name', 'last_name', 'id_card')

步骤4:修改views.py中的注册视图

替换原有注册视图的表单类为你自定义的表单,原有逻辑无需修改:

# 先导入自定义的表单
from .forms import CustomUserCreationForm

class RegisterPage(FormView):
    template_name = 'base/register.html'
    # 替换原来的UserCreationForm
    form_class = CustomUserCreationForm
    redirect_authenticated_user = True 
    success_url = reverse_lazy('tasks')

    # 原有form_valid、get方法逻辑保持不变即可
    def form_valid(self, form):
        user = form.save()
        if user is not None:
            login(self.request, user)
        return super(RegisterPage, self).form_valid(form)

    def get(self, *args, **kwargs):
        if self.request.user.is_authenticated:
            return redirect('tasks')
        
        return super(RegisterPage, self).get(*args, **kwargs)

步骤5:迁移数据库

因为你之前已经跑过默认用户模型的迁移,需要先清理旧的迁移和数据库避免冲突:

  1. 删除根目录下的db.sqlite3文件
  2. 删除base/migrations目录下除了__init__.py之外的所有迁移文件
  3. 执行迁移命令:
python manage.py makemigrations
python manage.py migrate

后续使用说明

  • 注册模板如果是用{{ form.as_p }}之类的自动渲染方式,不需要修改模板,新加的字段会自动展示
  • 后续调用用户字段直接用request.user.id_card、request.user.email即可,不需要额外关联查询
  • Task模型的原有逻辑完全不受影响

内容的提问来源于stack exchange,提问作者Random CS Student

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:15:08