2012-02-23 70 views
4

我在我的页面上有django formsets,有几个额外的表单;我只想向用户(最初)显示其中已有数据的表单。根据POST中的数据增加Django formset中初始表单的数量?

目前我通过渲染每一形式处理这个隐藏:

{% 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 count]

到目前为止,这么好。当formset只包含初始数据时,这是完美的。

现在,我的问题是,当一些数据输入到表单中,并且表单被验证为无效时,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 

回答

0

事实证明,该解决方案是使用该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() 
+0

以及如何/在哪里使用这个manform实例? – binithb 2016-01-20 21:38:57

+0

@binithb无论你需要什么。可能在视图中。 – Marcin 2016-01-20 22:45:20

+0

我在使用此解决方案时不断收到'MultiValueDictKeyError'。 – 2017-09-11 10:46:22