2009-11-19 80 views
0

我想保存一个模型表示一个银行账户,但即使窗体出现验证,我仍然收到ValueError。我必须使用的型号有:ModelForm保存失败

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) 

的的ModelForm的personBankAcc;

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}) 

当我尝试保存表单我得到,即使它被传递的form.is_valid(与A VlaueError除外)检查,我得到的错误是:
Cannot assign "u'26'": PersonBankAcc.bank must be a "bank" instance

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

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

任何帮助将不胜感激。

感谢
安德鲁

+0

只是好奇,应该是在的ModelForm元模型EmpBankAcct还是应该是PersonBankAcc?我问,因为我没有看到EmpBankAcct模型。 – 2009-11-19 01:53:39

+0

另一个输入错误是我输入另一个键时输入了一个内容。它应该是PersonBankAcc。 – 2009-11-19 03:29:22

回答

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) 
+0

原因是您的选择字段试图将字符串保存到需要对象实例(银行)的模型中。 – 2009-11-19 01:16:18

+0

另外,这可能是将示例移动到这种形式时出现的错误,但是您的表单init函数说明了iit而不是init。 – 2009-11-19 01:17:24

+0

iit是发布到论坛的错字。当我删除弹出窗口小部件时,我保留表单的init函数,并且它仍然有效。我尝试了你的建议,最后得到一个空的选择列表。 – 2009-11-19 01:26:15