【问题标题】:Django formset apparently only printing first form in template (because of invalid markup)Django formset 显然只在模板中打印第一个表单(因为标记无效)
【发布时间】:2012-03-02 04:46:51
【问题描述】:

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

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

这是模板行:

<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>

中断视图,打印表单集显示它包含两个表单(existing_template_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

如您所见,在这两种情况下,表单集中的表单总数都是 2(如管理表单所示),但根本没有生成第二个。

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

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

为了完整起见,这里是创建表单集的代码:

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())

【问题讨论】:

  • 你在哪里定义existing_articles,和exisiting_template_formset一样吗?
  • @j_syk: "(existing_template_formset 是视图内表单集的名称):"
  • 你可以试试{{ myformset.as_p }}{% for form in myformset %} {{ form.as_p }} {% endfor %} 吗?
  • 很奇怪,打印语句生成了 2 个表单,但没有生成模板。
  • 是的,我看到了,所以你在传递给模板时重命名了它?我意识到你发现了你的问题,只是想弄清楚你是如何定义/传递你的模板变量的。

标签: django django-forms django-templates


【解决方案1】:

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

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

现在,当它被替换为 &lt;tr id="existing_docs_row"&gt;&lt;td colspan="2"&gt;{{ existing_articles.management_form }}{% for f in existing_articles %}&lt;div&gt;{{ f }}&lt;/div&gt;{% endfor %}&lt;/td&gt;&lt;/tr&gt; 时,会导致无效标记(trtr 中!)。

所以,原来是模板生成了第二个表单,但是浏览器的错误恢复方法(在chrome中,忽略了很多无效标记;在firefox中,将第二个表单浮动到DOM 中的其他地方)创建了第二个表单没有生成的外观。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2016-12-04
    • 2017-09-19
    相关资源
    最近更新 更多