【问题标题】:ModelForm save failsModelForm 保存失败
【发布时间】:2009-11-19 01:02:49
【问题描述】:

我正在尝试保存代表银行帐户的模型表单,但即使表单似乎已验证,我仍不断收到 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 检查中没有失败。

任何帮助将不胜感激。

谢谢
安德鲁

【问题讨论】:

  • 只是好奇 modelform 元数据中的模型应该是 EmpBankAcct 还是 PersonBankAcc?我问是因为我没有看到 EmpBankAcct 模型。
  • 另一个错字,我在输入另一件事时正在思考一件事。应该是 PersonBankAcc。

标签: django save modelform


【解决方案1】:

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

【讨论】:

  • 原因是您的选择字段正在尝试将字符串保存到需要(银行的)对象实例的模型中。
  • 另外,将示例移动到此表单中可能会出错,但您的表单初始化函数说的是 iit 而不是 init。
  • iit 是在论坛发帖时的拼写错误。当我删除弹出窗口小部件时,我保留表单的 init 功能,它仍然有效。我尝试了您的建议,但最终得到了一个空的选择列表。
  • 嗯。您是否也将 ChoiceField 更改为 ModelChoiceField?
  • 我编辑了我的答案。我认为你不需要 init 函数,因为你并没有真正传递任何额外的东西。 Bank.objects.all() 查询集不依赖于传递给模型表单的任何内容。
猜你喜欢
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 2015-10-08
  • 2017-06-29
  • 2014-01-14
  • 2012-07-23
相关资源
最近更新 更多