Django ModelForm保存失败
我试图保存一个表示银行帐户的modelform,但我一直得到一个ValueError,即使该表单看起来是有效的。我必须使用的模型有:Django ModelForm保存失败,django,save,modelform,Django,Save,Modelform,我试图保存一个表示银行帐户的modelform,但我一直得到一个ValueError,即使该表单看起来是有效的。我必须使用的模型有: class Person(models.Model): name = models.CharField() class PersonBankAcc(models.Model): person = models.ForeignKey(Person) 个人银行账户的模板 def PersonBankAccForm(forms.ModelForm
class Person(models.Model):
name = models.CharField()
class PersonBankAcc(models.Model):
person = models.ForeignKey(Person)
个人银行账户的模板
def PersonBankAccForm(forms.ModelForm):
bank = forms.ChoiceField(widget=SelectWithPop)
class Meta:
model = PersonBankAcct
exclude = ['person']
def __init__(self, *args, **kwargs):
super(PersonBankAccForm, self).__init__(*args, **kwargs)
bank_choices = [bank.list_item for banks in Bank.objects.all()]
bank_choices.isert(0,('','------'))
self.fields['bank'].choices = bank_choices
意见是:
def editPersonBankAcc(request, personBankAcc_id=0):
personBankAcc = get_object_or_404(PersonBankAcc, pk=personBankAcc_id)
if request.method == 'POST':
form = PersonBankAccForm(request.POST, instance=personBankAcc )
if form.is_valid():
print 'form is valid'
form.save()
return HttpResponseRedirect('editPerson/' + personBankAcc.person.id +'/')
else:
form = PersonBankAccForm(instance=personBankAcc )
return render_to_response('editPersonBankAcc', {'form': form})
当我试图保存表单时,我得到一个VlaueError异常,即使它通过了表单。is_valid()检查,我得到的错误是:无法分配“u'26':PersonBankAcc.bank必须是“bank”实例
我知道问题是由于我在PersonBankAccForm中使用的小部件引起的:bank=forms.ChoiceField(widget=SelectWithPop)
因为如果我把它移除,它就会工作。但这一切都让我能够通过弹出窗口向数据库添加新银行,然后将其插入选择列表,类似于管理员弹出表单。我已经检查了数据库,新的银行被添加了。但即使我不做任何更改,它也会失败,如果我调用表单并提交它,我会得到相同的错误 我不明白为什么它在有效检查时没有失败 任何帮助都将不胜感激 谢谢
Andrew更好的是,我不认为它真的需要在init函数中
def PersonBankAccForm(forms.ModelForm):
bank = forms.ModelChoiceField(queryset=Bank.objects.all(),widget=SelectWithPop(),empty_label='-----')
class Meta:
model = EmpBankAcct
exclude = ['person']
def __init__(self, *args, **kwargs):
super(PersonBankAccForm, self).__init__(*args, **kwargs)
更好的是,我不认为它真的需要在init函数中
def PersonBankAccForm(forms.ModelForm):
bank = forms.ModelChoiceField(queryset=Bank.objects.all(),widget=SelectWithPop(),empty_label='-----')
class Meta:
model = EmpBankAcct
exclude = ['person']
def __init__(self, *args, **kwargs):
super(PersonBankAccForm, self).__init__(*args, **kwargs)
原因是您的选择字段试图将字符串保存到需要(银行的)对象实例的模型中。此外,将示例移动到此表单中可能会出现错误,但您的表单init函数显示的是iit而不是init。iit是发布到论坛中的一个输入错误。当我删除弹出窗口小部件时,我保持表单的init函数不变,它仍然工作。我尝试了你的建议,结果是一个空的选择列表。您是否也将ChoiceField更改为ModelChoiceField?我编辑了我的答案。我认为您不需要init函数,因为您实际上没有向它传递任何额外的内容。Bank.objects.all()queryset不依赖于传递给modelform的任何内容。原因是您的选择字段正试图将字符串保存到需要(银行的)对象实例的模型中。此外,将示例移动到此表单中可能会出错,但是你的表单初始化函数说的是iit而不是init。iit是论坛发帖时的一个输入错误。当我删除弹出窗口小部件时,我保持表单的init函数不变,它仍然工作。我尝试了你的建议,结果是一个空的选择列表。您是否也将ChoiceField更改为ModelChoiceField?我编辑了我的答案。我认为您不需要init函数,因为您实际上没有向它传递任何额外的内容。Bank.objects.all()queryset不依赖于传递给modelform的任何内容。只是好奇modelform元中的模型应该是EmpBankAcct还是应该是PersonBankAcc?我这样问是因为我没有看到EmpBankAcct模型。另一个输入错误,我在输入另一个东西的同时,在输入另一个东西。它应该是PersonBankAcc。只是好奇模型表单元中的模型应该是EmpBankAcct还是应该是PersonBankAcc?我这样问是因为我没有看到EmpBankAcct模型。另一个输入错误,我在输入另一个东西的同时,在输入另一个东西。它应该是PersonBankAcc。
def PersonBankAccForm(forms.ModelForm):
bank = forms.ModelChoiceField(queryset=Bank.objects.all(),widget=SelectWithPop(),empty_label='-----')
class Meta:
model = EmpBankAcct
exclude = ['person']
def __init__(self, *args, **kwargs):
super(PersonBankAccForm, self).__init__(*args, **kwargs)