django-dynamic-formset:删除表单然后添加表单会导致我出现问题

时间:2014-12-04 07:29:04

标签: jquery django forms django-forms

使用jQuery Formset 1.3-pre

如果我使用jquery-formset删除现有表单,那么在同一页面上添加一个新表单并点击保存,我收到此错误:

Request Method: POST
Django Version: 1.7
Exception Type: ValidationError
Exception Value: ["'' value must be an integer."]

导致错误的值似乎是:

self    django.db.models.fields.AutoField: id

只有在添加新表单以替换一个formset会话中的已删除表单时才会发生这种情况。如果我删除,保存,添加,保存,那很好。只有当我删除,添加,保存时才会收到此错误。

我认为django使用TOTAL-FORMS和INITIAL-FORMS变量来计算它是处理新的还是预先存在的表单,但因为我返回的表单数量与INITIAL-FORMS相同,即使其中一个表单是一个新表单,它认为所有表单都是预先存在的表单并尝试验证id。无论如何,还是那样的东西。

有没有办法为新表单添加前缀,告诉django它处理添加的表单,以便它不会尝试验证ID?

我错过了什么?

感谢

约翰

PS可能是相关的,可能不是:我的jquery.formset删除例程使用ajax从数据库中删除任何与现有表单对应的行。我从来没有找到任何关于动态删除表单的文档,所以我只是认为这就是我应该做的。

1 个答案:

答案 0 :(得分:3)

如果您的表单集包含现有实例的表单和空白行的表单,则需要通过从HTML行类中删除“dynamic”来从jquery-formset控件中删除现有实例的表单。像这样:

{% for a_form in my_formset %}
    <tr {% if not a_form.instance.pk %}class="dynamic"{% endif %}>
        {{ a_form.id }}
        <td>{{ a_form.a_field }}</td>
        <td>{{ a_form.another_field}}{{ a_form.another_field.errors }}</td>
        <td>{% if a_form.instance.pk %}{{ a_form.DELETE }}{% endif %}</td>
     </tr>
{% endfor %}

这不仅会阻止jquery-formset弄乱现有记录的表单,而且会产生Django表单所期望的删除复选框。

如果允许class = dynamic用于现有记录,则jquery-formset将创建一个“删除”链接,允许用户从POST数据中完全删除它们。您收到错误消息,因为现有记录已从POST中删除并替换为空白表单。错误[“''值必须是整数。”]指的是记录的ID从整数变为空字符串。