【问题标题】:How to label a form instance within a django inline formset?如何在 django 内联表单集中标记表单实例?
【发布时间】:2016-11-29 23:40:00
【问题描述】:

我有一个我认为很常见的情况,但我似乎无法理解它。我使用django.forms.inlineformset_factory 创建了一组表单,允许用户更改外键对象的各个方面,这些都可以正常工作。

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

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)

我创建了我的表单集以允许人们更改 Daffy Duck 的任何一本书的页数:

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

假设 Daffy 已经写了五本书,这些都显示为整数条目,都标有“Pages”,没有提及每本书指向哪本书。如何用书名标记表单,以便他们知道他们正在更改哪一个?我尝试将字典传递给inlineformset_factory 函数的labels 字段,但它不起作用。

【问题讨论】:

    标签: django inline-formset


    【解决方案1】:

    首先,请注意内联表单集是模型表单集的一个小包装,因此适用于后者的大部分内容都适用于前者。模型表单集是一种呈现一组表单的方法,每个表单都与模型的一个实例相关。因此,您正在尝试同时考虑多个抽象级别。

    接下来,请参阅“Using a formset in views and templates”的文档,其中描述了编写您自己的模板来呈现表单集:

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

    【讨论】:

    • 感谢@bignose 的快速回复!抱歉(继续)如此密集,但我如何分配whatever_attribute_you_like?我正在使用默认的 inlineformset_factory 而不指定中间表单,并且在我的模板中仅使用 {{form.title}}(为了与我上面的例子保持一致)不起作用?
    猜你喜欢
    • 1970-01-01
    • 2019-05-15
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 2011-07-11
    相关资源
    最近更新 更多