我在models.py中创建了扩展用户模型,如下所示:
class Employee(models.Model):
user = models.OneToOneField(User)
customfield1 = models.CharField(max_length=100)
customfield2 = models.CharField(max_length=100)
我想将这些字段添加到注册表单中。我分析了this topic。这是正确的解决方案,但我无法应用到我的网站。我设计了注册表,但我无法注册用户。我正在使用的代码在这里: forms.py(这是我的原始表单,但这不会将Employee数据保存到db中):
class AdvancedRegistrationForm(UserCreationForm):
customfield = forms.CharField(max_length=100,label="Address")
class Meta:
model = User
fields = ('first_name', 'last_name', 'username', 'email', 'customfield1', 'customfield2')
def save(self, commit=True):
user = super(AdvancedRegistrationForm, self).save(commit=False)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.username = self.cleaned_data['username']
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
views.py:
def register(request):
if request.method == 'POST':
form = AdvancedRegistrationForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect("/../login")
else:
form = AdvancedRegistrationForm()
return render_to_response("register.html", {
"form": form,
}, RequestContext(request))
forms.py(这是我根据此解决方案创建的表单,但它不注册/保存任何内容):
class AdvancedRegistrationForm(forms.ModelForm):
def __init__(self, instance=None, *args, **kwargs):
_fields = ('first_name', 'last_name', 'username', 'email', )
_initial = forms.model_to_dict(instance.user, _fields) if instance is not None else {}
super(AdvancedRegistrationForm, self).__init__(initial=_initial, instance=instance, *args, **kwargs)
self.fields.update(forms.fields_for_model(User, _fields))
class Meta:
model = Employee
exclude = ('user',)
def save(self, *args, **kwargs):
u = self.instance.user
u.first_name = self.cleaned_data['first_name']
u.last_name = self.cleaned_data['last_name']
u.username = self.cleaned_data['username']
u.email = self.cleaned_data['email']
u.save()
profile = super(AdvancedRegistrationForm, self).save(*args,**kwargs)
profile.user = u
profile.customfield = self.cleaned_data['customfield']
return profile