Django formset中的水平(每行)表单

时间:2010-02-10 02:01:11

标签: django django-forms

Django水平呈现formset的方式是什么,即每个表单一行? as_table方法垂直生成多个表单(带有标签)。我需要表格行中的表单字段(每个表单一行),标签应该在顶部。我没有看到任何开箱即用的东西。这是因为某些原因而沮丧的吗?

我应该澄清我实际上想要一个表,因为我将使用的是一个UI表小部件。那个表应该有标签。

所以我想要的结构是:

<table>
  <thead>
     <tr><th>column1</th><th>column2</th></tr>
  </thead>
  <tbody>
    <tr><td>form1.value1</td><td>form1.value2</td></tr>
...
  </tbody>
</table>

2 个答案:

答案 0 :(得分:26)

你可能想尝试这样的事情http://www.djangosnippets.org/snippets/1442/

{{ formset.non_form_errors.as_ul }}
<table id="formset" class="form">
{% for form in formset.forms %}
  {% if forloop.first %}
  <thead><tr>
    {% for field in form.visible_fields %}
    <th>{{ field.label|capfirst }}</th>
    {% endfor %}
  </tr></thead>
  {% endif %}
  <tr class="{% cycle row1 row2 %}">
  {% for field in form.visible_fields %}
    <td>
    {# Include the hidden fields in the form #}
    {% if forloop.first %}
      {% for hidden in form.hidden_fields %}
      {{ hidden }}
      {% endfor %}
    {% endif %}
      {{ field.errors.as_ul }}
      {{ field }}
    </td>
  {% endfor %}
  </tr>
{% endfor %}
</table>

答案 1 :(得分:7)

我建议使用form.as_ul并使用CSS设置样式以将其全部放在一行上。您可以使用ul li { display: inline; }执行此操作,当然,如果您不希望以这种方式影响所有UL,则可以替换类或ID。

以下是Django文档的相关部分:http://docs.djangoproject.com/en/dev/topics/forms/#displaying-a-form-using-a-template

编辑: 为了满足你对表的需求,你想要做这样的事情...再编辑一些。

很难将所有这些表单放在表中,并且仍然具有有效的HTML。表单元素可以围绕一个表格,或者位于<td>内......尽管这可能仍然有用。

<thead>
  <tr>
   {% for field in form %}
     <th>{{ field.label }}</th>
   {% endfor %}
  </tr>
</thead>

<tbody>
 <tr class="table_row">
  <form action="/something/" method="post">
    {% for field in form %}
      <td>
       <table>
        <tr><td>{{ field.label }}</td></tr>
        <tr><td>{{ field }}</td></tr>
       </table>
      </td>
    {% endfor %}
   </form>
  </tr>
 </tbody>