Django:将表单放入表单中(递归...)

时间:2014-07-13 11:16:56

标签: python django forms recursion django-forms

我喜欢Django表单库,但如果表单可以包含表单,那就更好了。

我的梦想是这样的:

  • 我有一个行为与普通形式相似的形式:例如一个名为SuperForm
  • 的类
  • SuperForm可以包含多种常规形式,甚至(递归)SuperForms
  • 您可以将其绑定到数据(以使其绑定),调用is_valid() ...

这可以用django或外部应用程序吗?

更新

我看到很多人不明白我想要什么。我的错,我没有给出一个用例。

使用案例:页面应允许用户更新其电子邮件和电话号码。该电子邮件来自django.contrib.auth,电话号码来自我们的自定义模型。

两个输入都应该在一个<form>标记中。由于ModelForm易于使用,因此我不想亲手制作表单。

我想要一个容器,其中包含ModelForm django.contrib.auth.models.User和我们自定义模型的ModelForm

我不想在两个表单上循环(在其他用例中可能会有更多表单),并检查它们是否有效。

如果我在容器上调用is_valid()save(),则会调用表单的匹配方法。

4 个答案:

答案 0 :(得分:3)

你应该试试django-composite-form。有了这个,您将能够编写如下代码:

取自与软件包一起分发的示例

from django import forms
from django.contrib.auth.forms import UserCreationForm
from composite_form.forms import CompositeForm
from example.models import Profile


class BaseProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        exclude = ("user")


class ProfileForm(CompositeForm):
    form_list = [UserCreationForm, BaseProfileForm]

    def clean_address(self):
        return "blah"

    def save(self, commit=True):
        if not self.is_valid():
            raise ValueError("Invalid form")
        user_form = self.get_form(UserCreationForm)
        user = user_form.save()
        profile_form = self.get_form(BaseProfileForm)
        profile_form.instance.user = user
        return profile_form.save()

答案 1 :(得分:1)

我不确定你究竟想要达到什么目标,但我必须解决一次动态表格的问题。

如果您有 ONE 表单(或ModelForm或您需要的任何内容),则可以在视图中根据需要初始化该表单多少次。

如果您有一个名为MyForm的表单,则可以在您的视图中执行以下操作:

...        ...
form1 = MyForm(...)
form2 = MyForm(...)
form3 = MyForm(...)
...         ...

您可以将所有这些内容发送到模板。

这些表单数量不需要是静态的,您可以将多个“动态”表单添加到列表中,并将表单列表发送到模板并根据需要进行管理。 / p>

对于你和那些试图帮助你的人来说,如果你更多地解释一下你的情况以及你为什么想要实现这一目标会更好,因为也许我的答案对你来说没用。

无论如何,我强烈建议您查看Django FormSets,因为这是在一个模板中生成/管理动态表单的最佳方式


在哪种情况下,您需要这种“动态”形式吗?

您想要获得哪些信息?

您是否尝试动态创建对象?

您是否尝试根据某些信息提供多种表单?

您将如何在模板/视图中管理此“动态”表单?

答案 2 :(得分:0)

乍一看,你的想法似乎很复杂。当前的问题是 - &#34;为什么需要这样的功能?&#34;。 99%的任务可以通过内置的Django&#34; brick&#34;来解决,另外1% - &#34;请硬编码&#34;。此外,我可能会认为这种想法背后的问题也很复杂,并且最终用户难以理解。

答案 3 :(得分:-1)

我认为你以不同于你应该的方式思考形式。

表单只是用于输入。它们的处理方式取决于您。

当然,您可以在表单上运行is_valid,这将检查您已分配的模型表单。很棒的是你可以在同一个表格上查看多个模型表格。将处理模型表单所需的数据,将忽略额外的数据。如果is_valid失败,您仍然会像往常一样将数据传回。