UserRegsitrationForm django 的选择字段的数据未存储在数据库中
Data not storing in database for choice field for UserRegsitrationForm django
我扩展了 Django 的 UserCreationForm 以添加额外的字段:Email 和 Choice 字段。现在,当我在注册表中填写这些详细信息并提交时。只有电子邮件存储在数据库中,而不是选择字段(即代码中的状态)。但是,当我在控制台中查看表单的字段时,会显示选择字段。
但是,当我使用 django shell 访问该属性时,出现错误
from django.contrib.auth.models import User
users = User.objects.all()
users[6].email
Output : masterhimanshupoddar@gmail.com # success
users[6].status
Error: AttributeError Traceback (most recent call last)
<ipython-input-7-c9d2701fa919> in <module>()
----> 1 users[6].status
AttributeError: 'User' object has no attribute 'status'
这是我的forms.py
from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.contrib.auth.models import User
class SignUpForm(UserCreationForm):
STATUS_CHOICES = (
(1, ("CEO")),
(2, ("Dev Manager")),
(3, ("Testing Manager")),
(4, ("Developer")),
(5, ("Test Engineer"))
)
email = forms.EmailField(required=True,
label='Email',
error_messages={'exists': 'Oops'})
status = forms.ChoiceField(choices = STATUS_CHOICES, label="Designation", initial='Developer', widget=forms.Select(), required=True)
class Meta:
model = User
fields = ("username", "email", "password1", "password2", "status")
def save(self, commit=True):
user = super(UserCreateForm, self).save(commit=False)
user.email = self.cleaned_data["email"]
user.status = self.cleaned_data["status"]
if commit:
user.save()
return user
为什么我会收到错误消息?
将字段添加到表单中是不够的,还必须将其添加到模型中。
为此,您需要在 models.py
:
中创建自定义用户 class
from django.contrib.auth.models import AbstractUser
STATUS_CHOICES = (
(1, ("CEO")),
(2, ("Dev Manager")),
(3, ("Testing Manager")),
(4, ("Developer")),
(5, ("Test Engineer"))
)
class User(AbstractUser):
status forms.ChoiceField(choices = STATUS_CHOICES, verbose_name ="Designation")
然后您必须更改设置 AUTH_USER_MODEL
以相应地指向您的模型。假设包含您的新自定义用户模型的应用名为 my_app
,设置将如下所示:
AUTH_USER_MODEL = 'my_app.User'
您还必须确保模型中的任何 ForeignKey
字段使用 AUTH_USER_MODEL
而不是 django.contrib.auth.models.User
:
从 django.conf 导入设置
来自 django.db 导入模型
class Article(models.Model):
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
另外不要忘记创建和应用数据库迁移:
python manage.py makemigrations
python manage.py migrate
不幸的是,在项目中期更改用户模型可能会导致棘手的问题,因此如果您仍处于项目早期,删除并重新创建数据库可能是最简单的方法。
请在您的表格中使用 get_user_model()
引用您的模型:
from django.contrib.auth import get_user_model
class SignUpForm(UserCreationForm):
...
class Meta:
model = get_user_model()
上的文档
我扩展了 Django 的 UserCreationForm 以添加额外的字段:Email 和 Choice 字段。现在,当我在注册表中填写这些详细信息并提交时。只有电子邮件存储在数据库中,而不是选择字段(即代码中的状态)。但是,当我在控制台中查看表单的字段时,会显示选择字段。 但是,当我使用 django shell 访问该属性时,出现错误
from django.contrib.auth.models import User
users = User.objects.all()
users[6].email
Output : masterhimanshupoddar@gmail.com # success
users[6].status
Error: AttributeError Traceback (most recent call last)
<ipython-input-7-c9d2701fa919> in <module>()
----> 1 users[6].status
AttributeError: 'User' object has no attribute 'status'
这是我的forms.py
from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.contrib.auth.models import User
class SignUpForm(UserCreationForm):
STATUS_CHOICES = (
(1, ("CEO")),
(2, ("Dev Manager")),
(3, ("Testing Manager")),
(4, ("Developer")),
(5, ("Test Engineer"))
)
email = forms.EmailField(required=True,
label='Email',
error_messages={'exists': 'Oops'})
status = forms.ChoiceField(choices = STATUS_CHOICES, label="Designation", initial='Developer', widget=forms.Select(), required=True)
class Meta:
model = User
fields = ("username", "email", "password1", "password2", "status")
def save(self, commit=True):
user = super(UserCreateForm, self).save(commit=False)
user.email = self.cleaned_data["email"]
user.status = self.cleaned_data["status"]
if commit:
user.save()
return user
为什么我会收到错误消息?
将字段添加到表单中是不够的,还必须将其添加到模型中。
为此,您需要在 models.py
:
from django.contrib.auth.models import AbstractUser
STATUS_CHOICES = (
(1, ("CEO")),
(2, ("Dev Manager")),
(3, ("Testing Manager")),
(4, ("Developer")),
(5, ("Test Engineer"))
)
class User(AbstractUser):
status forms.ChoiceField(choices = STATUS_CHOICES, verbose_name ="Designation")
然后您必须更改设置 AUTH_USER_MODEL
以相应地指向您的模型。假设包含您的新自定义用户模型的应用名为 my_app
,设置将如下所示:
AUTH_USER_MODEL = 'my_app.User'
您还必须确保模型中的任何 ForeignKey
字段使用 AUTH_USER_MODEL
而不是 django.contrib.auth.models.User
:
从 django.conf 导入设置 来自 django.db 导入模型
class Article(models.Model):
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
另外不要忘记创建和应用数据库迁移:
python manage.py makemigrations
python manage.py migrate
不幸的是,在项目中期更改用户模型可能会导致棘手的问题,因此如果您仍处于项目早期,删除并重新创建数据库可能是最简单的方法。
请在您的表格中使用 get_user_model()
引用您的模型:
from django.contrib.auth import get_user_model
class SignUpForm(UserCreationForm):
...
class Meta:
model = get_user_model()
上的文档