Django ModelForm保存失败

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

我试图保存一个表示银行帐户的modelform,但我一直得到一个ValueError,即使该表单看起来是有效的。我必须使用的模型有:

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)