【问题标题】:Add extra parameter to inlineformset_factory向 inlineformset_factory 添加额外参数
【发布时间】:2013-01-07 14:09:31
【问题描述】:

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

我已经阅读了 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)

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

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

我已经尝试将BaseInlineFormSet 子类化,但我并没有真正突破。

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

谢谢!

【问题讨论】:

  • 您在此处使用的 initial 关键字参数负责 HTML 选项中的“selected”属性等内容。您应该改用关键字参数queryset

标签: python django


【解决方案1】:

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

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

现在我确实相信这是要走的路,但我必须重构代码以使其现在更具动态性

【讨论】:

    【解决方案2】:

    在视图中定义表单集

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多