如何在Django User模型中添加选项并继承UserCreationForm实现自定义表单
Django自定义User模型+继承UserCreationForm报错解决方案
以下是可直接落地的修复步骤:
- 第一步:配置settings.py指定自定义用户模型
必须在项目settings.py中添加如下配置,将<你的app名称>替换为存放自定义User模型的app名:
注意:该配置必须在首次执行数据库迁移前设置。如果你之前已经运行过AUTH_USER_MODEL = '<你的app名称>.User'migrate命令,需要删除所有app下migrations文件夹中除__init__.py外的所有文件,删除现有数据库后重新执行python manage.py makemigrations和python manage.py migrate。 - 第二步:修改models.py字段属性适配可选要求
你需要给自定义的type字段添加空值允许配置,满足可选要求:from django.contrib.auth.models import AbstractUser from django.db import models TYPE_CHOICES =( ("individual", "Individual"), ("company", "Company"), ) class User(AbstractUser): # 添加blank=True允许表单为空,null=True允许数据库存空值,若要求注册必填可去掉这两个参数 type = models.CharField(choices=TYPE_CHOICES, max_length=20, blank=True, null=True) - 第三步:修正forms.py的错误配置
首先要确保导入的是你自定义的User模型,而非Django默认的用户模型,同时要在字段列表中补充UserCreationForm默认必填的用户名、密码字段,否则会因缺失核心字段报错:from django import forms from django.contrib.auth.forms import UserCreationForm # 从自己的models导入自定义User和选项,不要导入django默认的auth.User from .models import User, TYPE_CHOICES class UserForm(UserCreationForm): first_name = forms.CharField(max_length=50, required=False) # 可选则加required=False type = forms.ChoiceField(choices=TYPE_CHOICES, required=False) # 可选则加required=False class Meta: model = User # 必须包含默认必填的username、password1、password2,再追加自定义字段 fields = ['username', 'password1', 'password2', 'first_name', 'type'] - 第四步:视图层调用无需额外修改
修复后在视图中正常实例化UserForm,调用form.save()即可自动将自定义字段存入用户表。
内容的提问来源于stack exchange,提问作者Abin Benny
相关产品推荐
相关产品推荐

