在Django循环中继续HTML表单

时间:2013-02-05 23:04:05

标签: html django forms django-templates

是否可以关闭,然后重新打开/继续页面上的html表单?基本上我有一个spreadsheet-esk web front从数据库中提取数据。但是,我被要求将字段分成左边的div和右边的div。原因是他们想要在右边div上有一个水平滚动条,因为它包含更多的字段,然后是左边的div(左边的div字段就像没有滚动条的静态字段),这是为了复制现有电子表格的外观。

我决定在我的模板中使用两个for循环来完成此操作。第一个循环生成页面的左侧,然后我关闭左侧div,第二个循环生成页面的右侧,然后我关闭右侧div。

由于我这样做的方式,我有一个问题,我在关闭第一个表单之前有很多表单元素。

<div left>
   <% for bla in bla %}
       <form id="{{ bla.id }}"><submit>
       <input value="{{ bla.name}}"><input value="{{ bla.number }}">
   {% endfor %}
</div>
<div right>
    {% for bla2 in bla2 %}
       <input value="{{ bla2.address}"><input value="{{ bla2.state }}">
       </form>
    {% endfor %}
</div> 

显然我遇到了问题,因为当您查看由上面类似的代码生成的html时,您有许多在生成第二个div之前不会关闭的表单元素。所以我的POST数据始终是最后一条记录。

我尝试了什么,我给了表单一个名字和ID,{{bla.id}}。然后我在第一个循环中关闭表单,并在第二个循环中添加一个具有相同id和名称{{bla.id}}的新标记。

我认为页面会知道这个表单是以前表单的延续,但是它不起作用,我似乎无法找到解决方法。

也许我的整个逻辑都是关闭的,我应该以不同的方式生成整个页面。也许有一个我想念的简单解决方案......

我希望我解释得那么好。

任何帮助都将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:0)

[编辑]

从评论中,如果您想为每条记录设置一个提交按钮,您仍然可以使用下面列出的标记,将每个表单标记循环为“行”。对象名称blahblah2有些误导,特别是如果所有字段都包含单个模型。

如果字段实际上是同一模型的所有部分,则for循环将简单地移动到表单标记之外,而不是在每个“列”中。

如果您不想手动输出字段,另一个选项是使用模型formset来生成模型表单的多个实例。您的标记几乎与下面概述的标记完全相同,但您可以在formset循环之外为formset的管理表单添加额外的字段。

示例:

<form action="." method="post" enctype="application/x-www-form-urlencoded">
    <div id="left_column">
        <fieldset>
            {% for bla in blah %}
                <input name="name" value="{{ bla.name}}" />
                <input name="number" value="{{ bla.number }}" />
            {% endfor %}
        </fieldset>
    </div>
    <div id="right_column">
        <fieldset>
            {% for bla2 in blah2 %}
                <input name="address" value="{{ bla2.address}" />
                <input name="state" value="{{ bla2.state }}" />
            {% endfor %}
        </fieldset>
    </div>
    <input type="submit" value="Submit" />
</form>

您的每个表单元素都需要一个name属性,否则您将无法在request.POST QueryDict中找到它们。表单标记必须包含您希望作为POST的一部分提交的所有元素,除非您通过JavaScript进行POST并通过JavaScript收集值。