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()

请参考Substituting a custom User model

上的文档