我正在尝试保存代表银行帐户的模型,但即使表单似乎已验证,我仍然会收到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检查中没有失败。
非常感谢任何帮助。
感谢
安德鲁
答案 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)