我正在尝试为 Web 应用程序的客户端创建一个基本的用户注册系统。
我已经创建了适当的视图和模板来创建一个表单页面,该页面创建一个 Django 用户对象和一个我自己创建的 UserProfile 对象。(这些通过 1-1 字段链接)。
在我的注册页面访问并填写表格后,我点击提交,与初始化UserProfile字段相关的字段将被清除,并且“此字段为必填项”。错误将显示在每个输入框上(尽管之前已正确填写)。如果我再次填写这些选定的字段,然后按提交,注册请求将被正确处理。
在终端中,我为每个表单打印了 is_valid() 的值。在第一次通过时,User 表单返回 true,而 UserProfile 表单返回 false。在第二次提交时,它们都返回 true。
你能帮我理解为什么第二个表格在第一次通过时返回错误并迫使我重新提交吗?
代码如下:
模型.py
from django.db import models
from django.contrib.auth.models import User
from django.forms import ModelForm
class UserProfile(models.Model):
user = models.OneToOneField(User)
name = models.CharField(max_length=100)
phone = models.CharField(max_length=32)
email = models.CharField(max_length=100)
institute = models.CharField(max_length=100)
address1 = models.CharField(max_length=100)
address2 = models.CharField(max_length=100)
city = models.CharField(max_length=100)
country = models.CharField(max_length=100)
postal_code = models.CharField(max_length=24)
description = models.TextField(max_length=2500)
def __unicode__(self):
return self.name
class UserForm(ModelForm):
class Meta:
model = User
fields = ['username', 'password', 'email']
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
exclude = ['user']
视图.py
def registration(request):
if request.method == 'POST':
print('post')
user_form = UserForm(request.POST, prefix='user')
profile_form = UserProfileForm(request.POST, prefix='userprofile')
print('user form ' + str(user_form.is_valid()))
print('profile form ' + str(profile_form.is_valid()))
if user_form.is_valid() and profile_form.is_valid():
print('both valid')
user = user_form.save(commit=False)
user.is_active = False
user.save()
userprofile = profile_form.save(commit=False)
userprofile.user = user
userprofile.save()
print('success')
return HttpResponseRedirect('registration-success/')
else:
print('unbound')
user_form = UserForm(prefix='user')
profile_form = UserProfileForm(prefix='profile')
context = { 'userform': user_form,
'userprofileform': profile_form,}
return render(request, 'registration/register.html', context)
def success(request):
return render(request, 'registration/success.html', )
模板.html
<!DOCTYPE html>
<html>
<body>
<h2> Registration </h2>
<form method="POST">
{% csrf_token %}
{{userform}}
</br></br>
{{userprofileform}}
<input type="submit" value="Submit"/>
</form>
<a href="password_reset/" id="forgot"> forgot username/password</a><br />
<a href="register" id="new">new user</a>
</body>
</html>