根据POST数据向Django表单集添加新表单

3 投票
2 回答
2895 浏览
提问于 2025-04-15 17:17

我正在尝试用POST请求中的数据来填充一个Django的表单集(formset)。我能正确显示这个表单集,并且大部分情况下可以重新实例化它,但我遇到了一个问题:表单集的最后出现了两行空白,这样不好。下面是我们在views.py中使用的函数:

forms.py

class DepositForm(forms.Form):
    InsID = forms.IntegerField()
    DepositTypeID = forms.IntegerField()
    DepositAmount = forms.IntegerField()
    Account = forms.IntegerField()

DepositFormSet = formset_factory(DepositForm, extra=1)

views.py

def _DepositEditor(request, c):
    if request.POST.has_key('form-0-InsID'):
        formset = DepositFormSet(request.POST)
        if formset.is_valid(): 
            formset = DepositFormSet(initial=formset.cleaned_data)
    else:
        formset = DepositFormSet()
    c['formset'] = formset
    
    return render_to_response('deposits/dep.html', c)

dep.html

<form action="" method="post">  

{{formset.management_form}}
{% for form in formset.forms %}
    {{form.errors }}
    {% for field in form %}
        {{field.label}}: {{field}}
    {% endfor %}
  <br />
{% endfor %}

<input type="submit" name="add" value="Add Deposit"></input>

</form>

这应该是所有相关的代码。无论如何,模板显示了整个表单集,应该包括一行空白(或者在出现错误的情况下,最后一行没有空白行,而是错误信息)。问题出现在你点击“添加”时,如果最后一行是空的。在代码中,这仍然通过了formset.is_valid()的验证,所以它就创建了一个多出一个字段的新表单集。如果你在这里点击添加,它会返回错误,但仍然允许你填写除了最后一行以外的所有行,并形成一个有效的表单集。有没有办法告诉我的表单集,空白的表单应该不通过验证?或者有没有更好的方法来解决这个问题?这个页面最终计划集成一些jquery的东西,所以虽然这不是理想的情况,但如果有好的方法可以用jquery工具来解决这个问题,那也许就足够了。非常感谢!

2 个回答

1

我自己没有这样做过,但如果你想让一个空白的输入变得无效,也许可以考虑把这个逻辑放在清理方法里:

http://docs.djangoproject.com/en/dev/topics/forms/formsets/#custom-formset-validation

2

在你的 views.py 文件里:

-            formset = DepositFormSet(initial=formset.cleaned_data)
+            data = formset.cleaned_data
+            if data[-1]=={}:
+                data=data[:-1]
+            formset = DepositFormSet(initial=data)

这看起来更像是一个功能,而不是一个错误哦;)

撰写回答