我需要你的帮助。 我扩展类User并添加相同的字段,而不是扩展UserCreationForm,但表单无效。 如果form.is_valid(),代码崩溃。 请帮忙,为什么我的表格不正确?
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True, related_name='profile')
nick_name = models.CharField(max_length=15)
我的注册表格
class MyRegisterForm(UserCreationForm):
print "OK!"
nick_name = forms.CharField(max_length=30, required=True, widget=forms.TextInput)
print "Ook"
class Meta:
model = UserProfile
def save(self, commit=True):
if not commit:
raise NotImplementedError("Can't create User and UserProfile without database save")
print "Saving..."
user = super(MyRegisterForm, self).save(commit=False)
user.nick_name = self.cleaned_data["nick_name"]
user_profile = UserProfile(user=user, nick_name=self.cleaned_data['nick_name'])
user_profile.save()
print "Saving complete"
return user, user_profile
注册功能
def reg(request):
if request.method =='POST':
form = MyRegisterForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
print username
password1 = form.cleaned_data['password1']
print password1
password2 = form.cleaned_data['password2']
print password2
nick_name = form.cleaned_data['nick_name']
print nick_name
form.clean_username()
if password1 == password2:
new_user = form.save()
return render_to_response('registration/registration_complete.html')
else:
print "Password error"
return render_to_response('registration/registration_fail.html')
else:
print "FORM error" #ТУТ ВАЛИТСЯ :(
return render_to_response('registration/registration_fail.html')
else:
form = UserCreationForm() # An unbound form
return render_to_response('registration/registration_new_user.html', {
'form': form,
},context_instance=RequestContext(request))
在设置中
AUTH_PROFILE_MODULE = 'registration.UserProfile'
注册模板
{% extends "base.html" %}
{% block content %}
<h1>Registration</h1>
<form action="registration" method="post">
{% if form.error_dict %}
<p class="error">Please fix the error.</p>
{% endif %}
{% if form.username.errors %}
{{ form.username.html_error_list }}
{% endif %}
<label for="id_username">Login:</label><br> {{ form.username }}<br>
{% if form.password1.errors %}
{{ form.password1.html_error_list }}
{% endif %}
<label for="id_password1">pass:</label><br> {{ form.password1 }}<br>
{% if form.password2.errors %}
{{ form.password2.html_error_list }}
{% endif %}
<label for="id_password2">pass(again):</label><br> {{ form.password2 }}<br>
{% if form.nick_name.errors %}
{{ form.nick_name.html_error_list }}
{% endif %}
<label for="id_nick_name">nick:</label><br> {{ form.nick_name }}<br>
<br>
<input type="submit" value="Reg" />
</form>
{% endblock %}
答案 0 :(得分:0)
嗯,您的代码中有几个问题。例如,您使用UserCreationForm
覆盖MyRegistrationForm
,并且当请求为POST
时确实会实例化后者,但如果不是,则将模板传递给普通UserCreationForm
。
user
中有UserCreationForm
,因为这是ModelForm
,其模型为UserProfile
,并且您已定义user
字段。因此,当您使用POST
创建表单时,表单会对此产生抱怨。
我在这里看不到一个非常清晰的解决方案,因为您的代码有些棘手,但首先,请同时使用GET
和POST
请求类型的相同表单,以便在您的视图中使用此行< / p>
form = UserCreationForm() # An unbound form
会改变这个:
form = MyRegistrationForm() # An unbound form
在模板中,它不会显示在字段user
中,因为您不包含它们,但它在表单中。在创建新用户时,该字段应设置为不需要,因为您正在创建用户,因此没有用户与UserProfile
关联。您可以将其设置为非必需,将参数blank=True
添加到模型中:
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True, related_name='profile', blank=True)
nick_name = models.CharField(max_length=15)
<强>更新强>
这是您的基类UserCreationForm
save
方法的代码:
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
如您所见,此代码假定用户具有set_password
属性,为了解决此问题,您必须向def set_password(self, raw_password)
类添加UserProfile
方法。发生此错误是因为表单基类设计用于普通Django User
类,您可能遇到的任何其他错误,您可能会通过添加UserProfile
所需的字段来解决它。这个解决方法如下:
class UserProfile:
...
def set_password(self, raw_password):
# whatever logic you need to set the password for your user or maybe
self.user.set_password(raw_password)
...
我希望这能为问题带来一些启示。祝你好运!