我有一个modelform formset允许用户添加空行,通过AJAX删除现有行,并使用jQuery sortable重新排列行。
添加/重新排列只是在表单上设置值,并保存为formset.save()
的一部分。
添加新行机制生成最后一个现有行的克隆,并生成正确的输入名称,例如:form-0-id
。
如上所述,delete操作调用AJAX,然后在成功时从DOM中删除该行。
重新排列设置隐藏的重量输入,这是模型的一部分。
按“保存”后,将按顺序执行以下操作:
据我所知console.log
,上述步骤均按预期执行,但我收到错误的一个案例是:
我得到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);
永远解决问题!
答案 0 :(得分:1)
我认为问题在于,当您删除表单时,您的JS不会修改form-INITIAL_FORMS
的值。因此,Django认为您的新表单实际上是更新,而不是添加,并尝试修改现有的数据库行 - 但当然您有该行的空白ID。尝试在删除中递减form-INITIAL_FORMS
。