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:迁移数据库
因为你之前已经跑过默认用户模型的迁移,需要先清理旧的迁移和数据库避免冲突:
- 删除根目录下的
db.sqlite3文件 - 删除
base/migrations目录下除了__init__.py之外的所有迁移文件 - 执行迁移命令:
python manage.py makemigrations python manage.py migrate
后续使用说明
- 注册模板如果是用
{{ form.as_p }}之类的自动渲染方式,不需要修改模板,新加的字段会自动展示 - 后续调用用户字段直接用
request.user.id_card、request.user.email即可,不需要额外关联查询 - Task模型的原有逻辑完全不受影响
内容的提问来源于stack exchange,提问作者Random CS Student
相关产品推荐
相关产品推荐

