我正在使用UserCreationForm的扩展版本通过我自己的模板添加用户,该模板运行良好。
我还希望在同一个表单模板中包含来自我的userprofile模型的自定义字段,以便在创建用户时还可以创建包含我的自定义字段的用户配置文件。
我的方法是使用两个表单,并将它们组合在一个模板中,并带有一个提交按钮。
表单完全按照我的意愿显示,并正确返回验证错误,但可以预见,在保存到数据库时会出现问题。当我在用户表单上调用save()创建用户时,但当我尝试保存userprofile表单时,它会抛出一个错误,因为用户尚不存在,所以它没有用户关联它。
虽然我认为我理解问题的原因,但我不知道如何修复它,我甚至不确定我采取的方法是否正确。
我已将下面的所有代码包括在内,包括模型以及表单和视图,以防万一这有助于任何人更好地理解我要做的事情:
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)
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
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))
答案 0 :(得分:8)
首先,将exclude = ('user',)
添加到ProfileForm的Meta类中。然后,在您看来:
user_valid = uform.is_valid()
profile_valid = pform.is_valid()
if user_valid and profile_valid:
user = uform.save()
profile = pform.save(commit=False)
profile.user = user
profile.save()
虽然我发现由于您在配置文件表单上只有一个字段,但更简单的方法是完全忘记该表单,只需将该字段添加到用户表单中:
class UserCreationFormExtended(UserCreationForm):
level = forms.ChoiceField(choices=LEVEL, max_length=20)
... etc...
if uform.is_valid():
user = uform.save()
profile = Profile.objects.create(user=user, level=uform.cleaned_data['level']))
答案 1 :(得分:0)
我在这里找到了类似的解决方案: http://sontek.net/blog/detail/extending-the-django-user-model
基本上你只是扩展默认表单UserCreationForm但保持相同的名称。通过这样做你不必添加任何新的视图或类似的东西,它与Django的文档告诉你做UserProfiles的方式无缝地工作。
坦率地说,我不明白为什么他们会解释如何将字段添加到管理页面,然后不告诉你如何在任何地方实际使用这些字段。