2009-11-19 79 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