【问题标题】:Adding new forms to a Django formset based on POST data基于 POST 数据向 Django 表单集添加新表单
【发布时间】:2010-12-29 05:11:13
【问题描述】:

我正在尝试使用来自 POST 请求的数据填充 Django 表单集。我能够正确显示表单集并再次实例化它,但我遇到了一个问题,表单集最后有 2 个空白行,这是不可取的。下面是我们一直在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 工具解决这个问题的好方法可能就足够了。非常感谢!

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    在你的views.py中:

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

    它看起来更像是一个特性而不是一个 bug ;)

    【讨论】:

      【解决方案2】:

      我自己并没有这样做,但如果你真的想用一个空白条目使它无效,也许你会考虑把它放在 clean 方法中:

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

      【讨论】:

        猜你喜欢
        • 2010-12-23
        • 2011-12-11
        • 1970-01-01
        • 2020-05-30
        • 2012-03-13
        • 2014-09-06
        • 2018-08-26
        • 1970-01-01
        • 2013-02-06
        相关资源
        最近更新 更多