2014-09-05 89 views
0

我正在尝试执行注册过程中的第二部分(葡萄牙语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> 

回答

1

您的观点也没有创造GET请求的形式 - 你是如何呈现的初始形成?

如果表单无效,请打印pessoaForm.errors以查看问题所在。打印request.POST以确保预期的数据在那里。它看起来像清醒的领域有问题,所以请特别仔细检查。

+0

其实我考虑到了这一点。当我得到'request.user.pessoa'时,我实际上正在调用与'User'相关的'Pessoa'对象。我可以通过在类“Pessoa”中使用'related_name ='pessoa''属性来实现。 – user2449798 2014-09-05 17:22:50

+0

对不起,我的错误,我误解你的代码。 – Alasdair 2014-09-05 18:58:11

0

我认为这里的主要问题是您用来实现“用户配置文件”的方法。见Storing additional information about users。你已经是中途了。

如果您已正确配置用户配置文件,则可以将该表单与您的配置文件类关联 - Pessoa在这种情况下 - 。

另一方面,您不包括usuarionome_completo,但最后一个不是Pessoa类的字段。

另外,您的Pessoa类的字段与某些User模型字段的字段相同,例如:primeiro_nome

建议:

  1. 介绍浏览我发布的链接。
  2. 检查你的设计,也许你不想在Pessoa类中定义字段primeiro_nome
  3. 检查request.user.pessoa中的数据是您所期望的。意思是primeiro_nomesobrenome字段有一些数据。

终于在answer - 最后的评论 - 你可以看到这个OP正在努力解决你的问题。

他说:对于记录我也试过user_form = UserForm(request.POST, instance=user, prefix='user'):没有错误,但总是返回一个空格

也许你可以尝试加载表单这个答案propossed的方式。