0

我有一个产品模型和一个价格模型。价格模型对产品模型有 FK。可能有多个价格(取决于售出的单位数量)。在 django 1.2.5 http://yergler.net/blog/2009/09/27/nested-formsets-with-django/之前可以解决这个问题。但详细http://www.mail-archive.com/django-users@googlegroups.com/msg124195.html这不再有效。

最终想要的结果:下面的表格来编辑和添加数据。

产品一-价格一、数量-价格二、数量 产品二-价格一、数量 产品三-价格一、数量-价格二、数量-价格三、数量

为了清楚起见,转载:

在 Nathan 的原始代码中,最底层的表单集是这样创建的:

TenantFormset(data=self.data,
              instance=instance,
              prefix='TENANTS_%s' % pk_value)

其中 instance 是 Building 的实例,租户的“父级”或容器,self 是

class BaseBuildingFormset(BaseInlineFormSet)

这是这样实例化的:

BuildingFormset = inlineformset_factory(models.Block,
                                        models.Building,
                                        formset=BaseBuildingFormset,
                                        extra=1)

为了解决这个问题,我停止传入 self.data,这导致最底层的表单始终具有 is_bound = False,即使在渲染并发布回视图之后也是如此。因此验证总是失败并且表单所代表的对象不能被更新。我已经使用 Nathan 博客文章中的代码重现了该行为,因此这种嵌套表单集的方法似乎不再有效,或者代码需要调整才能在 1.3 中工作。

在 Django 1.2.5 之前,Nathan 的代码运行良好。但是在 1.3 中,如果将 self.data 传递给 TenantFormset,则结果为空并引发 ValidationError,因为尚未提供 ManagementForm 信息。
这是#11418,AFAICT 的预期结果。

有没有人对如何使它起作用有任何其他想法?

干杯,

(抱歉没有详细的代码示例 - Nathan 的帖子比我的代码更清晰,所以我建议你看一下。)

一般说明:关于如何做到这一点似乎有很多困惑,这里的回复显示http://www.reddit.com/r/django/comments/hwyto/is_there_a_way_to_do_nested_formsets_in_django/

4

3 回答 3

2

正如 django 文档所说,如果表单未绑定,则有必要传递 data = None :

data = None
if self.data:
    data = self.data
form.nested = [ModelXYFormset(data=data, instance = instance, prefix = 'opt%s' % pk_value)]
于 2013-02-21T09:27:02.550 回答
0

这是一种解决方法,似乎可以让子表单进行验证。

在 BaseBuildingFormset 中:

def is_valid(self):
    result = super(BaseProtocolEventFormSet, self).is_valid()

    for form in self.forms:
        if hasattr(form, 'nested'):
            for n in form.nested:
                n.data = form.data
                if form.is_bound:
                    n.is_bound = True
                for nform in n:
                    nform.data = form.data
                    if form.is_bound:
                        nform.is_bound = True
                # make sure each nested formset is valid as well
                result = result and n.is_valid()
    return result

每个表单和表单集的数据应该相同(完整的 POST 数据)。在这里,我们为没有得到它的表单手动设置它。我们还可以看到,在 BaseForm 类中,is_bound 只是验证表单是否有数据或文件,因此一旦表单有数据,我们就将其设置为 true。

于 2011-12-06T12:42:52.847 回答
0

我目前正在尝试同样的事情。我已经从 Nathan 的代码中实现了相同的解决方案,但遇到了ValidationError问题。让我们的 Django 1.3 更新了表单集的工作方式,如下所示。所以对于我的代码,

TenantFormset(data=self.data, instance=instance, prefix='TENANTS_%s' % pk_value)

变成

TenantFormset(instance=instance, prefix='TENANTS_%s' % pk_value)

但我仍然得到一个空白表格。

于 2011-10-04T17:28:17.460 回答