ModelForm保存失败

时间:2009-11-19 01:02:49

标签: django save modelform

我正在尝试保存代表银行帐户的模型,但即使表单似乎已验证,我仍然会收到ValueError。我必须使用的模型是:

class Person(models.Model):
   name = models.CharField()


class Bank(models.Model):
    bsb = models.CharField()
    bank_name = models.CharField()  
    def __unicode__(self):
        return '%s - %s', (self.bank_name, self.bsb)
    def _get_list_item(self):
        return self.id, self
    list_item = property(-get_list_item)


class BankAccount(models.Model):
    bank = models.ForignKey(Bank)
    account_name = models.CharField()
    account_number = models.CharField()  


class PersonBankAcc(models.Model):
    person = models.ForeignKey(Person)

personBankAcc的ModelForm;

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异常,即使它通过了form.is_valid()检查,我得到的错误是:
Cannot assign "u'26'": PersonBankAcc.bank must be a "bank" instance

我知道问题出现是因为我在PersonBankAccForm中使用的小部件:
bank = forms.ChoiceField(widget=SelectWithPop)
因为如果我删除它就有效。但所有这一切使我能够通过弹出窗口向数据库添加新的银行,然后将其插入到选择列表中,类似于管理弹出窗体。我检查了数据库并添加了新的银行。但即使我没有改变任何东西它也会失败,如果我调用表单并提交它,我会得到同样的错误。

我不明白为什么它在is_valid检查中没有失败。

非常感谢任何帮助。

感谢
安德鲁

1 个答案:

答案 0 :(得分:3)

更好的是,我认为它确实不需要在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)