【问题标题】:Custom formset templates in DjangoDjango 中的自定义表单集模板
【发布时间】:2013-03-28 18:32:12
【问题描述】:

我正在为这个模型使用 Django formset

class Book(models.Model):
    book_id=models.AutoField(primary_key=True,unique=True)
    book_name=models.CharField(max_length=30)
    publisher_name=models.CharField(max_length=40)
    author=models.ForeignKey(Author)

formset 是这样定义的:

BookFormset = inlineformset_factory(Author, Book, 
    fields=('book_id','book_name', 'publisher_name'), extra=1, 
    can_delete=False)

模板是:

{{ 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 }}
    {% 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>

这些字段按列显示,但我希望它们按行显示。

上面的代码产生如下输出:

Book name   Publisher name

book_field       Publisher_field

我希望输出如下所示:

Book name   book_field

Publisher name   Publisher_field

我该怎么做?

【问题讨论】:

    标签: django django-forms django-templates django-views inline-formset


    【解决方案1】:

    在您的模板中,您有两个&lt;tr&gt; 元素,每个元素都包含一个对form.visible_fields 的循环,其每次迭代都会生成一个&lt;th&gt;&lt;td&gt;

    更改这一轮,以便在form.visible_fields 上有一个循环,其每次迭代都包含一个&lt;tr&gt; 元素,其中包含一个&lt;th&gt; 和一个&lt;td&gt;。像这样:

    <table id="formset" class="form">
    {% for form in formset.forms %}
      {% for field in form.visible_fields %}
      <tr class="{% cycle row1,row2 %}">
        <th>{{ field.label|capfirst }}</th>
        <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>
      </tr>
      {% endfor %}
    {% endfor %}    
    </table>
    

    【讨论】:

    • 你是对的,字段名称是粗体,如何更改为正常的
    • 在样式表中添加一条规则 (font-weight:normal)。或者使用td 而不是th
    【解决方案2】:

    上面的示例似乎显示了按列布局,这似乎是表单集呈现自身时的默认布局。

    要使其按行排列,请使用以下内容:

    <table>
        {% for form in formset.forms %}
            {% if forloop.first %}
                <thead>
                    {% for field in form.visible_fields %}
                        <th>{{ field.label }}</th>
                    {% endfor %}    
                </thead>
                <tbody>
            {% endif %}
    
            <tr class="{% cycle row1,row2 %}">                        
                {% for field in form.visible_fields %}
                    <td>
                        {% if forloop.first %}
                            {% for hidden in form.hidden_fields %}
                                {{ hidden }}
                            {% endfor %}
                        {% endif %}
    
                        {{ field.errors.as_ul }}
                        {{ field }}
                    </td>
                {% endfor %}
            </tr>
            {% if forloop.last %}
                </tbody>
            {% endif %}
        {% endfor %}    
    </table>
    

    【讨论】:

      猜你喜欢
      • 2014-07-12
      • 2017-05-02
      • 1970-01-01
      • 2011-10-05
      • 2018-04-14
      • 1970-01-01
      • 2015-11-28
      • 2014-02-06
      • 2021-04-14
      相关资源
      最近更新 更多