首页 文章

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

提问于
浏览
1

我认为这是一个常见的情况,但可以't seem to get my head around it. I'使用 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)

说Daffy已经写了五本书,这些书都显示为整数条目,所有条目都标记为"Pages",没有提到每本书指向的书 . 如何使用书名标记表单,以便他们知道哪一个_2980295已经尝试将字典传递给 inlineformset_factory 函数的 labels 字段,但它不起作用 .

1 回答

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

相关问题