在Django Model Formset中添加字段会导致另一个字段出现IntegrityError

时间:2012-01-12 11:30:44

标签: python django django-forms

所以我有一个模型表格,我与一个modelformset工厂一起使用。

如果我像这样离开表单类,我不会收到任何错误:

class CheckinForm(ModelForm):

class Meta:
    model = Checkout
    fields = ('return_date', )


def __init__(self, *args, **kwargs):
    super(CheckinForm, self).__init__(*args, **kwargs)
    self.fields['return_date'].widget = CheckboxInput()

如果我向extension添加了另一个字段fields,我会收到(1048, "Column 'book_id' cannot be null"),但是,更改会保存到数据库中。

这是我的模特:

class Checkout(models.Model):
book = models.ForeignKey(Book)
user = models.ForeignKey(User)
checkout_date = models.DateField(auto_now_add = True)
return_date = models.DateField(null = True, blank=True)
extension = models.IntegerField("Extension in days", blank = True, default = 0)

以下是处理表单的视图:

def checkin(request):
c = RequestContext(request, dictionary)
CheckinFormSet = modelformset_factory(Checkout, CheckinForm)
if request.method == "POST":
    data = request.POST.copy()
    for i in range(0, int(data['form-TOTAL_FORMS'])):
        if 'form-' + str(i) + '-return_date' in data:
            data['form-' + str(i) + '-return_date'] = datetime.date.today().isoformat()
        else:
            data['form-' + str(i) + '-return_date'] = ''

    formset = CheckinFormSet(data = data)
    user_form = AutoUserForm(data = data)
    if formset.is_valid():
        c['cool'] = 'cool'
        formset.save()
    else:
        c['err'] = formset.errors
        c['data'] = data
else:
    CheckinFormSet = modelformset_factory(Checkout, CheckinForm)
    user_form = AutoUserForm()
c['user_form'] = user_form
c['form'] = CheckinFormSet
c['context'] = 'checkin'
return render_to_response('lib_admin/checkin.html', {}, c)

我必须浏览表单数据,因为对于return_date字段,我只有一个用户将勾选的复选框,并且它将插入当前日期。

这对我来说似乎很奇怪,特别是因为数据已保存,即使我收到了IntegrityError。

1 个答案:

答案 0 :(得分:1)

blank=Truedefault一起使用并不是一个好主意。它具有值(默认)或不具有(空白),但不能同时具有值​​。

解决方案:

extension = models.IntegerField("Extension in days", default=0)