【问题标题】:Horizontal (per-row) forms in a Django formsetDjango 表单集中的水平(每行)表单
【发布时间】:2011-01-15 02:10:46
【问题描述】:

Django 水平呈现表单集的方式是什么,即每个表单一行? 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>

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您可能想尝试类似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>
    

    【讨论】:

    • 是的,就是这样。放入模板是一件很冗长的事情。对于如此冗长的内容,您可能希望它作为类似 as_table 的方法,或者您希望能够使用参数调用模板(而不仅仅是包含它们)。我真的很惊讶像 Django 这样成熟的东西没有开箱即用。
    • 我通常将其添加为通用模板(另存为 formset_table.html),然后对于每个 formset 模板我通过 {% include "formset_table.html" %},但我同意它会很好可以呈现为内置方法。
    • 我最终也做了同样的事情。而且因为我有一个包含多个此类表单的页面,所以我最终使用 with 标记对其进行参数化。
    • 如果您收到“ManagementForm 数据丢失或已被篡改”错误,请在 开始标记 github.com/django/django/blob/… 之后添加 {{ formset.management_form }}
    • 以上代码不包含{{ form.non_field_errors }}
    【解决方案2】:

    我建议使用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。表单元素可以围绕表格,也可以在 &lt;td&gt;... 内,尽管这可能仍然有效。

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

    【讨论】:

    • 请看我的澄清。我实际上需要一张桌子。
    • 我认为您将不得不在模板中进行自定义,而不是使用自动生成 HTML 的方法。然后你可以把它们都放在一个&lt;tr&gt;
    • 我看到了你的更新。谢谢!但是,我需要标签位于 中,首先是所有行,而不是对每一行重复。我基本上需要一个记录集的表格表示。令人惊讶的是,我在谷歌上找不到这个。
    • 好的,您只需在第一次查看元素并仅打印标签,如thead 中的th s,然后打印其余表格。跨度>
    • 是的。但是也要注意错误,等等。它变成了 Dave 在这里发布的 sn-p。不过,我很感激你的回答。作为 Django 的新手,我很欣赏任何想法。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签