将额外参数添加到inlineformset_factory

时间:2013-01-07 14:09:32

标签: python django

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

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

考虑以下代码行:

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

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

这很简单,因为inlineformset_factory创建了一个EmploymentFormSet。

现在考虑一下

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,它将使用查询集所包含的数量来填充我的formset。

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

我已经尝试了对BaseInlineFormSet进行子类化,但我还没有真正突破隔离墙。

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

谢谢!

2 个答案:

答案 0 :(得分:0)

我通过构建这个方法来解决它

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

现在我确实认为这是要走的路,但我必须重构代码才能使它更加动态,现在它只连接到一个类和一个类,但它就像一个魅力。

答案 1 :(得分: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()