gpt4 book ai didi

python - UserRegsitrationForm django 的选择字段的数据未存储在数据库中

转载 作者:行者123 更新时间:2023-12-01 00:30:12 25 4
gpt4 key购买 nike

我扩展了 Django 的 UserCreationForm 以添加额外的字段:电子邮件和选择字段。现在,当我在注册表中填写这些详细信息并提交时。只有电子邮件存储在数据库中,而不存储选择字段(即代码中的状态)。但是,当我在控制台中查看表单字段时,会显示选择字段。但是当我使用 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()

请参阅 Substituting a custom User model 上的文档

关于python - UserRegsitrationForm django 的选择字段的数据未存储在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58247205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com