【问题标题】:Increasing number of initial forms in a Django formset based on data in POST?根据 POST 中的数据,增加 Django 表单集中的初始表单数量?
【发布时间】:2012-03-13 21:12:31
【问题描述】:

我的页面上有 django 表单集,还有几个额外的表单;我只想(最初)向用户显示其中已有数据的表单。

目前我通过将每个表单呈现为隐藏来处理这个问题:

{% for form in incorporate_directors_formset %}
<tbody class="incorporate_directors_formset_div subform incorporate_directors_formset_invisible_div" id="incorporate_directors_formset_div_{{ forloop.counter }}">
        {{ form }}
</tbody>
<tr class="magic-last-row invisible"><td colspan=2><div></div></td></tr>
{% endfor %}

[.incorporate_directors_formset_invisible_div 只是设置display:none;]

然后使用 javascript 公开那些已经有数据的:

  for(i = directors_initialforms.val(); i > 0; i--)
        director_form_to_display($('.incorporate_directors_formset_invisible_div').first(), false);

[director_form_to_display 几乎只是删除了.incorporate_directors_formset_invisible_div 类并增加了TOTAL_FORMS 计数]

到目前为止,一切都很好。当表单集只包含初始数据时,这非常有效。

现在,我的问题是,当在表单中输入一些数据,并且表单验证为无效时,INITIAL_FORMS 值保持原来的状态,所以上面的代码没有显示现有的但错误的表单.

在我看来,如何增加 INITIAL_FORMS 计数以匹配浏览器发回的 TOTAL_FORMS 计数?或者,或者,确保 INITIAL_FORMS 计数足够大?

我试过 holding_formset.initial_forms = holding_formset.forms 但这给出了:

Traceback (most recent call last):

File "<debugger>", line 1, in <module>
holding_formset.initial_forms = holding_formset.forms
AttributeError: can't set attribute

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    原来解决办法是使用formset的管理表单来修改实际的请求数据:

    from django.forms.formsets import INITIAL_FORM_COUNT
    if formset.initial_form_count() < formset.total_form_count():
        manform = formset.management_form
        prefixed_name = manform.add_prefix(INITIAL_FORM_COUNT)
        manform.data[prefixed_name] = formset.total_form_count()
    

    【讨论】:

    • @binithb 随心所欲。可能在视图中。
    • 使用此解决方案时,我不断收到“MultiValueDictKeyError”。
    • @SandeepBalagopal 请记住,此解决方案已有五年历史。
    • 嗯。找不到任何其他解决方案。我有同样的要求。我的表单集中有两三个表单,但它们没有按要求进行验证,因为没有输入任何内容。只有第一个正在验证。
    猜你喜欢
    • 1970-01-01
    • 2010-12-26
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多