我正在尝试进行注册过程的第二部分,其中该人(在葡萄牙语Pessoa中)会提供一些关于他自己的额外信息,并且还会注册一些关于他拥有的汽车的信息(通过复选框查看)名为“tem_carro'”的模板,英文版本为“has_car'”。 在此步骤中,此人已经拥有用户名和密码以及一些基本信息(如姓名),这些信息是强制性的,并且会填写非强制性信息。
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>
答案 0 :(得分:1)
您的视图未创建获取请求的表单 - 您如何呈现初始表单?
如果表单无效,请打印pessoaForm.errors
以查看问题所在。打印request.POST
以确保预期的数据存在。它看起来像是一个有问题的sobernome字段,所以要特别仔细检查。
答案 1 :(得分:0)
我认为这里的主要问题是您用来实施&#34;用户个人资料&#34; 的方法。见Storing additional information about users。你已经走了一半。
如果您已正确配置用户个人资料,则可以将表单与您的个人资料类关联 - 在这种情况下为 Pessoa - 。
另一方面,您要排除usuario
和nome_completo
,但最后一个不是Pessoa
类的字段。
此外,您的Pessoa
类的字段与某些User
模型字段相同,例如:primeiro_nome
。
建议:
primeiro_nome
课程中定义字段Pessoa
。request.user.pessoa
中的数据是否符合您的期望。这意味着primeiro_nome
和sobrenome
字段包含一些数据。最后在这个answer - 最后评论 - 你可以看到这个OP正在努力解决你的问题。
他说:为了记录我还尝试user_form = UserForm(request.POST, instance=user, prefix='user')
:没有错误,但总是返回一个空表单。
也许您可以尝试按照此答案的方式加载您的表单。