我扩展了Django的UserCreationForm,以添加其他字段:电子邮件和选择字段。现在,当我在注册表中填写这些详细信息并提交时。仅电子邮件存储在数据库中,而不存储在选择字段(即代码中的状态)。但是,当我在控制台中查看表单的字段时,会显示选择字段。但是,当我使用django shell访问属性时,出现错误
from django.contrib.auth.models import User
users = User.objects.all()
users[6].email
Output : [email protected] # 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
以相应地指向您的模型。
现在您可以在表格中使用模型:
from django.contrib.auth.models import User
class SignUpForm(UserCreationForm):
...
class Meta:
model = User