我正在尝试执行注册过程中的第二部分(葡萄牙语Pessoa)会给出关于他自己的一些额外信息,并且还会注册关于他拥有的汽车的一些信息(通过名为'tem_carro'的模板中的复选框进行检查,英文为'has_car')。 在此步骤中,该人员将拥有用户名和密码以及一些基本信息,例如名称,这些信息都是强制性的,并且会填写非必填信息。Django窗体上的实例无法正常工作
问题instance=pessoa
(它应该从该人获得必须的信息)不起作用,因此我无法验证该表单。
在views.py:
def continuar_cadastro(request):
pessoa = request.user.pessoa # this is working
# and changing the above line to pessoa = Pessoa.objects.get(id = 1) for exemple doesn't solve either the validation problem
if request.method == 'POST':
pessoaForm = CadastroPessoaForm(request.POST, instance=pessoa) # the form isn't getting the pessoa's info (primeiro_nome and sobrenome)
if pessoaForm.is_valid(): # I can't get past here!
try:
request.POST['tem_carro']
carro = Carro(motorista=pessoa)
carroForm = CadastroCarroForm(request.POST, instance=carro)
if carroForm.is_valid():
carroForm.save()
pessoaForm.save()
else:
print(carroForm)
return HttpResponse("<script>alert('Form do carro inválido.');javascript:history.back();</script>")
except:
pessoaForm.save()
else:
print(pessoaForm)
return HttpResponse("<script>alert('Form de informações pessoais inválido.');javascript:history.back();</script>")
return render_to_response('continuar_cadastro.html', locals(), context_instance=RequestContext(request))
在forms.py:
class CadastroPessoaForm(forms.ModelForm):
class Meta:
model = Pessoa
exclude =('usuario', 'nome_completo')
在models.py:
class Pessoa(models.Model):
usuario = models.OneToOneField(User, related_name= 'pessoa')
primeiro_nome = models.CharField("Primeiro nome", max_length= 64)
sobrenome = models.CharField("Sobrenome", max_length=64)
celular = models.CharField("Calular", max_length= 16, null=True, blank=True)
residencial = models.CharField("Residencial", max_length=16, null=True, blank=True)
谢谢!
编辑1: 验证表单时,我得到的错误是这样的(我打印表格):
<tr><th><label for="id_primeiro_nome">Primeiro nome:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input id="id_primeiro_nome" maxlength="64" name="primeiro_nome" type="text" /></td></tr>
<tr><th><label for="id_sobrenome">Sobrenome:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input id="id_sobrenome" maxlength="64" name="sobrenome" type="text" /></td></tr>
<tr><th><label for="id_celular">Calular:</label></th><td><input id="id_celular" maxlength="16" name="celular" type="text" /></td></tr>
<tr><th><label for="id_residencial">Residencial:</label></th><td><input id="id_residencial" maxlength="16" name="residencial" type="text" value="khsdjgf" /></td></tr>
其实我考虑到了这一点。当我得到'request.user.pessoa'时,我实际上正在调用与'User'相关的'Pessoa'对象。我可以通过在类“Pessoa”中使用'related_name ='pessoa''属性来实现。 – user2449798 2014-09-05 17:22:50
对不起,我的错误,我误解你的代码。 – Alasdair 2014-09-05 18:58:11