(Django) 在 Django 表单向导中保存自定义用户模型
(Django) Saving a Custom User Model in Django Form Wizard
我在为用户创建多步骤注册页面时遇到问题。到目前为止,我有一个名为 Account 的自定义用户模型,我向其中添加了一些影响项目中其他内容的字段。当我只使用单步注册表格时,该模型工作正常。然而,一旦我过渡到多步骤注册表(使用 Django 表单向导)并将基本注册(电子邮件、用户名、密码)与其他字段分开,我就开始遇到一些困难。阅读 Django Form Wizard 文档没有多大帮助。 我还想指出,我在注册时创建了另一个模型(将我的自定义用户模型作为外键)。这是我的代码:
forms.py
class RegisterForm1(UserCreationForm):
email = forms.EmailField()
class Meta:
model = Account
fields = ["username", "email", "password1", "password2", ]
help_texts = {
'username': None,
'password1': None,
'password2': None,
}
def __init__(self, *args, **kwargs):
super(RegisterForm1, self).__init__(*args, **kwargs)
self.fields['password1'].help_text = ''
self.fields['password2'].help_text = ''
class RegisterForm2(forms.ModelForm):
class Meta:
model = Account
fields = ["int_field", "char_field", ]
def __init__(self, *args, **kwargs):
super(RegisterForm2, self).__init__(*args, **kwargs)
views.py
class register_new(SessionWizardView):
template_name = "register/register.html"
form_list = [RegisterForm1, RegisterForm2]
def done(self, form_list, form_dict, **kwargs):
form1 = RegisterForm1(self.request.POST)
form2 = RegisterForm2(self.request.POST)
if form1.is_valid() and form2.is_valid():
username = self.request.POST['username']
email = self.request.POST['email']
password = self.request.POST['password1']
int_field = self.request.POST['int_field']
char_field = self.request.POST['char_field']
user = Account(username=username, email=email, password=password, int_field=int_field, char_field=char_field)
user.save()
ModelA.objects.create(user=user, classification="c")
ModelA.objects.create(user=user, classification="h")
ModelA.objects.create(user=user, classification="f")
ModelA.objects.create(user=user, classification="e")
return redirect('/')
此代码甚至没有创建新用户(我可以看到我的 /admin 中没有任何反应)。我知道这与我的模型无关,因为当我使用简单的单步形式时一切正常。
tl;dr 我基本上想为自定义用户模型设置一个多步骤注册表,同时在注册时为用户创建一个新模型。
首先,您不需要验证表格。根据文档,当您到达 完成函数 时,表单已经过验证。
这个可以删除:
form1 = RegisterForm1(self.request.POST)
form2 = RegisterForm2(self.request.POST)
Because all the forms are available in the form_list
文档中的一种获取表单数据的方法如下:
form_data = {
'form_data': [form.cleaned_data for form in form_list],
}
之后您唯一需要做的就是从表单数据中获取值并创建用户对象。
我在为用户创建多步骤注册页面时遇到问题。到目前为止,我有一个名为 Account 的自定义用户模型,我向其中添加了一些影响项目中其他内容的字段。当我只使用单步注册表格时,该模型工作正常。然而,一旦我过渡到多步骤注册表(使用 Django 表单向导)并将基本注册(电子邮件、用户名、密码)与其他字段分开,我就开始遇到一些困难。阅读 Django Form Wizard 文档没有多大帮助。 我还想指出,我在注册时创建了另一个模型(将我的自定义用户模型作为外键)。这是我的代码:
forms.py
class RegisterForm1(UserCreationForm):
email = forms.EmailField()
class Meta:
model = Account
fields = ["username", "email", "password1", "password2", ]
help_texts = {
'username': None,
'password1': None,
'password2': None,
}
def __init__(self, *args, **kwargs):
super(RegisterForm1, self).__init__(*args, **kwargs)
self.fields['password1'].help_text = ''
self.fields['password2'].help_text = ''
class RegisterForm2(forms.ModelForm):
class Meta:
model = Account
fields = ["int_field", "char_field", ]
def __init__(self, *args, **kwargs):
super(RegisterForm2, self).__init__(*args, **kwargs)
views.py
class register_new(SessionWizardView):
template_name = "register/register.html"
form_list = [RegisterForm1, RegisterForm2]
def done(self, form_list, form_dict, **kwargs):
form1 = RegisterForm1(self.request.POST)
form2 = RegisterForm2(self.request.POST)
if form1.is_valid() and form2.is_valid():
username = self.request.POST['username']
email = self.request.POST['email']
password = self.request.POST['password1']
int_field = self.request.POST['int_field']
char_field = self.request.POST['char_field']
user = Account(username=username, email=email, password=password, int_field=int_field, char_field=char_field)
user.save()
ModelA.objects.create(user=user, classification="c")
ModelA.objects.create(user=user, classification="h")
ModelA.objects.create(user=user, classification="f")
ModelA.objects.create(user=user, classification="e")
return redirect('/')
此代码甚至没有创建新用户(我可以看到我的 /admin 中没有任何反应)。我知道这与我的模型无关,因为当我使用简单的单步形式时一切正常。
tl;dr 我基本上想为自定义用户模型设置一个多步骤注册表,同时在注册时为用户创建一个新模型。
首先,您不需要验证表格。根据文档,当您到达 完成函数 时,表单已经过验证。
这个可以删除:
form1 = RegisterForm1(self.request.POST)
form2 = RegisterForm2(self.request.POST)
Because all the forms are available in the form_list
文档中的一种获取表单数据的方法如下:
form_data = {
'form_data': [form.cleaned_data for form in form_list],
}
之后您唯一需要做的就是从表单数据中获取值并创建用户对象。