如何在django内联formset中标记表单实例?

时间:2016-11-29 23:40:01

标签: django inline-formset

我认为这是一个足够普遍的情况,但似乎无法理解它。我已经使用django.forms.inlineformset_factory创建了一个表单的formset,允许用户更改外键对象的各个方面,并且这些表单工作正常。

问题是我希望能够在formset中标记这些表单中的每一个(注意,不是每个表单中的字段,而是每个表单所基于的外键模型)。例如,如果我调整文档中的示例:

from django.db import models
from django.forms import inlineformset_factory

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    pages = models.IntegerField(default=0)

我创建了我的formset,允许人们更改Daffy Duck中任何一本书中的页数:

BookFormSet = inlineformset_factory(Author, Book, fields=('pages',))
author = Author.objects.get(name='Daffy Duck')
formset = BookFormSet(instance=author)

Say Daffy已经写了五本书,这些书都显示为整数条目,所有条目都标有" Pages",没有参考每本书所指的书。如何用表格的标题标记表格,以便他们知道他们正在改变哪一个?我已经尝试将字典传递到labels函数的inlineformset_factory字段,但它没有用。

1 个答案:

答案 0 :(得分:2)

首先,请注意内联formset是一个围绕模型formset的小包装器,因此适用于后者的大多数适用于前者。模型formset是一种呈现一组表单的方法,每个表单都与模型的一个实例相关。所以你试图同时考虑几个抽象层次。

接下来,请参阅“Using a formset in views and templates”文档,该文档描述了编写自己的模板以呈现formset:

<form method="post" action="">
    {{ formset.management_form }}
    <table>
        {% for form in formset %}
        {{ form }}
        {% endfor %}
    </table>
</form>

因此,如果您想标记每个表单 - 记住每个表单本身都是ModelForm描述模型的一个实例 - 您可以访问{% for %}块中的该表单:

<form method="post" action="">
    {{ formset.management_form }}
    <table>
        {% for form in formset %}
        <tr><th>{{ form.instance.foo_field }}</th></tr>
        {{ form }}
        {% endfor %}
    </table>
</form>