Django窗体上的实例无法正常工作
我正在尝试执行注册过程中的第二部分(葡萄牙语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>
您的观点也没有创造GET请求的形式 - 你是如何呈现的初始形成?
如果表单无效,请打印pessoaForm.errors
以查看问题所在。打印request.POST
以确保预期的数据在那里。它看起来像清醒的领域有问题,所以请特别仔细检查。
我认为这里的主要问题是您用来实现“用户配置文件”的方法。见Storing additional information about users。你已经是中途了。
如果您已正确配置用户配置文件,则可以将该表单与您的配置文件类关联 - Pessoa在这种情况下 - 。
另一方面,您不包括usuario
和nome_completo
,但最后一个不是Pessoa
类的字段。
另外,您的Pessoa
类的字段与某些User
模型字段的字段相同,例如:primeiro_nome
。
建议:
- 介绍浏览我发布的链接。
- 检查你的设计,也许你不想在
Pessoa
类中定义字段primeiro_nome
。 - 检查
request.user.pessoa
中的数据是您所期望的。意思是primeiro_nome
和sobrenome
字段有一些数据。
终于在answer - 最后的评论 - 你可以看到这个OP正在努力解决你的问题。
他说:对于记录我也试过user_form = UserForm(request.POST, instance=user, prefix='user')
:没有错误,但总是返回一个空格。
也许你可以尝试加载表单这个答案propossed的方式。
其实我考虑到了这一点。当我得到'request.user.pessoa'时,我实际上正在调用与'User'相关的'Pessoa'对象。我可以通过在类“Pessoa”中使用'related_name ='pessoa''属性来实现。 – user2449798 2014-09-05 17:22:50
对不起,我的错误,我误解你的代码。 – Alasdair 2014-09-05 18:58:11