Django formset显然只在模板中打印第一个表单(因为标记无效)

时间:2012-02-09 17:15:47

标签: django django-forms django-templates

[编辑:请参阅下面的回答 - 此问题的根源是无效标记,浏览器非常努力地隐藏它。 ]

我有一个肯定应该包含两种形式的formset,但无论出于何种原因,我只会在模板中打印一个表单。

这是模板行:

<tr id="existing_docs_row"><td colspan="2">{{ existing_articles.management_form }}{% for f in existing_articles %}<div>{{ f }}</div>{% endfor %}</td></tr>

我得到完全相同的行为(较少的div标签):

<tr id="existing_docs_row"><td colspan="2">{{ existing_articles }}}</td></tr>

创建管理表单和第一个表单,但不是第二个表单。这就是我在浏览器中获得的内容:

<input type="hidden" id="id_form-TOTAL_FORMS" value="2" name="form-TOTAL_FORMS"><input type="hidden" id="id_form-INITIAL_FORMS" value="2" name="form-INITIAL_FORMS"><input type="hidden" id="id_form-MAX_NUM_FORMS" name="form-MAX_NUM_FORMS"><div><div class="selected_row " id="selected_row"><span class="formlabel"></span><ul>
<li><label for="id_form-0-selected_0"><input type="radio" name="form-0-selected" value="True" id="id_form-0-selected_0"> </label></li>
</ul></div>
<div class="original_filename_row " id="original_filename_row"><span class="formlabel"><span id="for-id_form-0-original_filename-">Original filename:</span></span><div id="id_form-0-original_filename" name="form-0-original_filename">FakeExampleCompanyName.docx</div></div>
<div class="tags_row " id="tags_row"><span class="formlabel"><span id="for-id_form-0-tags-">Tags:</span></span><div id="id_form-0-tags" name="form-0-tags" class="tagarea"><span class="tagitem">England and Wales</span> <span class="tagitem">Private company limited by shares</span> <span class="tagitem">Model articles with amendments</span></div></div>

在视图中断开,并打印formset显示它包​​含两个表单(existing_template_formset是视图中的formset的名称):

>>> print existing_template_formset <input type="hidden" name="form-TOTAL_FORMS" value="2" id="id_form-TOTAL_FORMS" /><input type="hidden" name="form-INITIAL_FORMS" value="2" id="id_form-INITIAL_FORMS" /><input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS" /> 
<div id="selected_row" class="selected_row "> <span class="formlabel"></span><ul> <li><label for="id_form-0-selected_0"><input type="radio" id="id_form-0-selected_0" value="True" name="form-0-selected" /> </label></li> </ul></div> <div id="original_filename_row" class="original_filename_row "><span class="formlabel"><span id="for-id_form-0-original_filename-">Original filename:</span></span><div name="form-0-original_filename" id="id_form-0-original_filename">FakeExampleCompanyName.docx</div></div> <div id="tags_row" class="tags_row "><span class="formlabel"><span id="for-id_form-0-tags-">Tags:</span></span><div class="tagarea" name="form-0-tags" id="id_form-0-tags" ><span class="tagitem" >England and Wales</span> <span class="tagitem" >Private company limited by shares</span> <span class="tagitem" >Model articles with amendments</span></div></div> <tr><th></th><td><input type="hidden" name="form-0-id" id="id_form-0-id" /></td></tr> 
<div id="selected_row" class="selected_row "><span class="formlabel"></span><ul> <li><label for="id_form-1-selected_0"><input type="radio" id="id_form-1-selected_0" value="True" name="form-1-selected" /> </label></li> </ul></div> <div id="original_filename_row" class="original_filename_row "><span class="formlabel"><span id="for-id_form-1-original_filename-">Original filename:</span></span><div name="form-1-original_filename" id="id_form-1-original_filename" >FakeExampleCompanyName.docx</div></div> <div id="tags_row" class="tags_row "><span class="formlabel"><span id="for-id_form-1-tags-">Tags:</span></span><div class="tagarea" name="form-1-tags" id="id_form-1-tags" ></div></div> <tr><th></th><td><input type="hidden" name="form-1-id" id="id_form-1-id" /></td></tr>

>>> len(existing_template_formset) 2

正如您所看到的,在两种情况下,formset中的表单总数为2(如管理表单中所示),但第二个表单根本不生成。

以前有人遇到过这个吗?我该如何解决这个问题?

我在Windows上的python 2.7.2上使用django 1.3.1。

为了完整性,这里是创建formset的代码:

class ExistingTemplateFormset(modelformset_factory(ArticlesTemplate, extra = 0, form=ExistingTemplateForm)):
    def __init__(self, *args, **kwargs):
        super(ExistingTemplateFormset, self).__init__(*args, **kwargs)
        for x in self:
            x.fields['id'].widget = forms.HiddenInput()

            x.fields['original_filename'].editable = False
            x.fields['original_filename'].widget = SpanWidget(tag = u'div')


            x.fields['tags'].widget= TagArea()
            x.fields['tags'].help_text = u''

TagAreaSpanWidget存在)

在视图中:

existing_template_formset = ExistingTemplateFormset(queryset = the_organisation.get_template_articles())

1 个答案:

答案 0 :(得分:2)

眼尖的读者(事实证明,这不包括我,因此这个问题)会注意到我的输出包括在每个表格的末尾:

`<tr><th></th><td><input type="hidden" name="form-0-id" id="id_form-0-id" /></td></tr>` 

现在,当它被<tr id="existing_docs_row"><td colspan="2">{{ existing_articles.management_form }}{% for f in existing_articles %}<div>{{ f }}</div>{% endfor %}</td></tr>替换为导致无效标记时(tr内的tr!)。

所以,事实证明模板生成第二种形式,但是浏览器的错误恢复方法(在chrome中,忽略了很多无效标记;在firefox中,将第二种形式浮动到在DOM的其他地方创建了第二种形式没有生成的外观。

总结一下:只是检查DOM误导了我。尝试强制浏览器阻止错误,并查看原始标记。

相关问题