0

经过几个小时的搜索,我必须承认我被打败了。

我已经阅读了 Django 文档,但我真的找不到解决问题的方法。

考虑以下代码行:

EmploymentFormSet = inlineformset_factory(Profile, Employment, form=EmploymentForm, extra=3)

此代码位于基于类的视图中,该视图继承自UpdateView该方法并进一步位于该方法中get_context_data(self, *args, **kwargs):

这非常简单,因为 inlineformset_factory 创建了一个就业表单集。

现在考虑这个

queryset = Employment.objects.filter(profile__pk=self.kwargs['pk']).values()
context['emp_formset'] = EmploymentFormSet(prefix='emp_form', initial=queryset, auto_id=True)

我认为通过提供initial=queryset仅适用于未绑定实例 IIRC 的 ,它将填充我的表单集,其中包含查询集所包含的数量。

因此,在我的情况下,查询集将返回 4 Employments,但是在使用该extra参数时,我正在构建的表单集仅填充了该参数定义的数量,在我的示例中只有 3 个,因为我只定义了 3 个附加项。增加额外的将逐渐填充表单。

我试过子类化,BaseInlineFormSet但我还没有真正突破这堵墙。

我的问题是我将如何使用查询集包含的尽可能多的表单来填充表单集,我并不是真的想要一个精确的解决方案,而是更多的指向正确方向的指针!:)

谢谢!

4

2 回答 2

0

我通过构造这个方法解决了它

def set_extra_forms(extra_forms, **kwargs):
    EmploymentFormSet = inlineformset_factory(Profile, Employment, form=EmploymentForm, extra=extra_forms)
    return EmploymentFormSet(**kwargs)

现在我确实相信这是要走的路,但我必须重构代码以使其现在更具动态性,它只连接到一个类和一个类,但它就像一个魅力。

于 2013-01-07T14:23:44.483 回答
0

在视图中定义表单集

def employment_view(request, pk=None):
  #Define extra forms variable
  extra_forms = Employment.objects.filter(profile__pk=self.kwargs['pk']).count()
  #Define formset inside the view function
  EmploymentFormSet = inlineformset_factory(Profile, Employment, form=EmploymentForm, extra=extra_forms)
  #Use this in context
  context['emp_formset'] = EmploymentFormSet()
于 2020-07-14T17:56:32.523 回答