3

このモデルに Django フォームセットを使用しています。

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)

フォームセットは次のように定義されます。

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

これどうやってするの?

4

2 に答える 2

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-08-21T12:34:57.410 に答える
2

テンプレートには 2 つの<tr>要素があり、それぞれに のループが含まれておりform.visible_fields、その反復ごとに単一の<th>またはが生成され<td>ます。

このラウンドを変更して、 を 1 回ループするようにしますform.visible_fields。各反復には、 と を含む 1 つの<tr>要素が含ま<th>れます<td>。このような:

<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>
于 2013-04-06T09:43:26.790 に答える