int()的基数为10的无效文字:''保存修改后的模型集

时间:2013-04-02 09:51:23

标签: python django django-forms

我有一个modelform formset允许用户添加空行,通过AJAX删除现有行,并使用jQuery sortable重新排列行。

添加/重新排列只是在表单上设置值,并保存为formset.save()的一部分。

添加新行机制生成最后一个现有行的克隆,并生成正确的输入名称,例如:form-0-id

如上所述,delete操作调用AJAX,然后在成功时从DOM中删除该行。

重新排列设置隐藏的重量输入,这是模型的一部分。

按“保存”后,将按顺序执行以下操作:

  1. 剥去任何完全空白的行
  2. 将#id_form-TOTAL_FORMS设置为正确的值
  3. 重置每行上每个输入的名称属性,使其顺序,以防止因删除而产生间隙。
  4. 提交表格。
  5. 据我所知console.log,上述步骤均按预期执行,但我收到错误的一个案例是:

    1. 有5行
    2. 向第6行添加值
    3. 删除任何预先存在的行
    4. 点击保存
    5. 我得到invalid literal for int() with base 10: ''

      具体来说,这个错误来自:

      lib/python2.7/site-packages/django/db/models/fields/__init__.py in get_prep_value
          return int(value) ...
          Local vars:
              Variable    Value
              self    <django.db.models.fields.AutoField: id>
              value   u''
      

      我不太明白为什么这会失败,我认为自动字段的整个要点是设置一个值,如果它还没有。

      我也有些困惑,因为整个表单适用于添加新行,只要在保存整个表单之前没有删除。

      表单是否以某种方式记住不同的输入名称属性并尝试更新现有记录而不是保存新记录?

      这是来自失败请求的POST数据:

      Variable    Value
      form-INITIAL_FORMS      u'6'
      form-TOTAL_FORMS        u'3'
      form-MAX_NUM_FORMS      u''
      form-0-id               u'38'
      form-0-weight           u'0'
      form-0-disk_space       u'1'
      form-0-price_per_month  u'1'
      form-0-embedded_html    u'1'
      form-1-id               u'45'
      form-1-weight           u'3'
      form-1-disk_space       u'2'
      form-1-price_per_month  u'2'
      form-1-embedded_html    u'2'
      form-2-id               u''
      form-2-weight           u'6'
      form-2-disk_space       u'3'
      form-2-price_per_month  u'3'
      form-2-embedded_html    u'3'
      

      因此form-2-id尝试设置字段值似乎失败了,而不是允许auto执行它的工作。

      下面是成功提交的POST数据,但是我只是加载了表单,添加了一个新行然后保存。

      Variable            Value
      form-INITIAL_FORMS      u'2'
      form-TOTAL_FORMS        u'3'
      form-MAX_NUM_FORMS      u''
      form-0-id               u'38'
      form-0-weight           u'0'
      form-0-disk_space       u'1'
      form-0-price_per_month  u'1'
      form-0-embedded_html    u'1'
      form-1-id               u'48'
      form-1-weight           u'1'
      form-1-disk_space       u'2'
      form-1-price_per_month  u'2'
      form-1-embedded_html    u'2'
      form-2-id               u''
      form-2-weight           u'2'
      form-2-disk_space       u'3'
      form-2-price_per_month  u'3'
      form-2-embedded_html    u'3'
      

      据我所知,一切都与失败的请求相同,新行的ID为空白。

      完全追溯http://pastebin.com/AvegYgJA(对于SO而言太大了)

      复制和粘贴模式追溯 http://pastebin.com/9R68M6YX

      解决方案

      根据Daniel Roseman在下面的回答,我只需要设置id_form-INITIAL_FORMS以匹配更新行的数量。我没有在删除时减少初始表单,而是在提交表单之前将以下内容添加到我的JS中:

      $('#id_form-INITIAL_FORMS').val(this.form.find('span.row-id input[value!=""]').length);
      

      永远解决问题!

1 个答案:

答案 0 :(得分:1)

我认为问题在于,当您删除表单时,您的JS不会修改form-INITIAL_FORMS的值。因此,Django认为您的新表单实际上是更新,而不是添加,并尝试修改现有的数据库行 - 但当然您有该行的空白ID。尝试在删除中递减form-INITIAL_FORMS