我正在使用扩展版的UserCreationForm通过自己的模板添加用户,这个功能运行良好。
我还想在同一表单模板中包括来自我的userprofile模型的自定义字段,以便在创建用户时也创建具有自定义字段的用户配置文件。
我的方法是使用两个表单,并将它们合并到一个模板中,带有一个提交按钮。
表单的显示效果与我想要的完全相同,并正确返回验证错误,但是当涉及保存到数据库时,它会可预测地失败。当我在用户表单上调用save()时,用户被创建了,但当我尝试保存userprofile表单时,它会抛出一个错误,因为该用户尚不存在,因此它没有关联的用户。
虽然我认为我理解了问题的原因,但我不知道如何解决它,甚至不确定我采取的方法是否正确。
为了帮助任何人更好地理解我要做什么,我在下面包括了所有我的代码,包括模型、表单和视图:
UserProfile类(models.py)
LEVEL = (
('admin', 'administrator'),
('team', 'team leader'),
('member', 'team member'),
)
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
level = models.CharField(choices=LEVEL, max_length=20)
UserCreationForm和UserProfileForm类(forms.py)
UserCreationForm类是从Django内置的UserCreationForm类继承而来,它允许用户创建新用户。 UserProfileForm类是用于更新用户资料的表单。这两个类都定义在forms.py文件中。class UserCreationFormExtended(UserCreationForm):
def __init__(self, *args, **kwargs):
super(UserCreationFormExtended, self).__init__(*args, **kwargs)
self.fields['first_name'].required = True
self.fields['last_name'].required = True
class Meta:
model = User
fields = ('username', 'email', 'first_name', 'last_name')
class UserProfileForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(UserProfileForm, self).__init__(*args, **kwargs)
self.fields["level"].choices = ( ('admin', 'administrator'), ('team', 'team leader'), ('member', 'team member') )
class Meta:
model = UserProfile
使用add视图(views.py)
def user_add(request):
if request.method == 'POST':
uform = UserCreationFormExtended(request.POST)
pform = UserProfileForm(request.POST)
if uform.is_valid():
uform.save()
pform.save()
return render_to_response('user/add_success.html', context_instance=RequestContext(request))
else:
return render_to_response('user/add.html', { 'uform' : uform, 'pform' : pform }, context_instance=RequestContext(request))
else:
uform = UserCreationFormExtended()
pform = UserProfileForm()
return render_to_response('user/add.html', { 'uform' : uform, 'pform' : pform }, context_instance=RequestContext(request))