django:从给定的自定义表单和查询集构建一个formset

时间:2011-12-02 00:15:19

标签: django django-forms

同样是一个相当通用的任务,表单似乎很棘手。我正在尝试将一堆自定义表单放在一起,使用不同的args构造相同表单类的所有不同实例,给定模型中的每个条目一个。

例如,此自定义表单允许用户勾选一个复选框(如果他们已经到达目的地),并选择他们在那里完成的(多个)活动:

class VisitorDestinationForm(Form):
    def __init__(self, visitor, destination, *args, **kwargs):
        super(VisitorForm, self).__init__(*args, **kwargs)
        visitorDestinations = visitor.destinations.all()
        self.fields[destination.destination] = forms.BooleanField()
        self.fields[destination.destination].initial = destination in visitorDestinations 

我想在Destination查询集中为每个目标创建一个包含其中一种表单的formset。 (我可以使用咖喱处理visitor arg,如建议here

question的已接受答案意味着modelformset_factory可以采用简单的(自定义)表单和(不相关的)查询集。

但是,如果我尝试,我会收到错误:我无法使用modelformset_factory,因为VisitorDestinationForm不是模型的模型,我得到了我的查询集(虽然它们是相关的,但它们应该在构造函数中获取模型实例)。如果我查看代码(django 1.3)

,这就得到了证实

看起来django只处理3个案例:

  • formset_factory:用一个构造的相同类型的一组形式 相同的参数
  • modelformset_factory:查询集的一组模型表单 从那个模型
  • inlineformset_factory:通过FK链接的相关查询集的一组表单( M2M)

但是,如果要将从对象列表初始化的自定义表单列表放在一起,似乎没有任何内容。我对此感到惊讶,我认为这将是一个非常普遍的情况

我是否必须通过覆盖_construct_forms中的BaseFormSet方法来编写自己的自定义formset_factory?或者我应该在我的视图中单独处理一堆表单,在这种情况下是否需要注意(我听说验证可能很棘手)?

1 个答案:

答案 0 :(得分:0)

最后,只要您记得为每个表单传入不同的前缀,就可以通过在单个视图中处理独立表单列表来轻松完成此操作。

您可以在我之前发布的另一个密切相关的question

的答案中看到详细信息