经过几个小时的搜索,我必须承认我被击败了。
我已阅读过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,我不是真的想要一个精确的解决方案,而是更多的指针在正确的方向! :)
谢谢!
答案 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()