【问题标题】:Django: Put a Form into a Form (recursive ...)Django:将表单放入表单(递归......)
【发布时间】:2014-07-13 11:16:56
【问题描述】:

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

我的梦想是这样的:

  • 我有一个行为类似于正常形式的表单:例如一个名为 SuperForm 的类
  • SuperForm 可以包含几种范式,甚至(递归)SuperForms
  • 您可以将其绑定到数据(使其绑定),调用is_valid() ...

这可以通过 django 或外部应用程序实现吗?

更新

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

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

两个输入都应该在一个 <form> 标记中。由于ModelForm 好用,我不想自己手动创建表单。

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

我不想自己循环遍历这两种表单(在其他用例中可能有更多表单),并检查它们是否有效。

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

【问题讨论】:

  • 对此问题投反对票的尊敬的用户:请告诉我您为什么不喜欢它,以及如何改进它。谢谢。
  • 我不确定您是否了解表单的工作原理。你看过 Formsets 的文档吗? docs.djangoproject.com/en/1.6/topics/forms/formsets
  • @Johndt6 Formsets 只能 N 次同一个表单类。我想要 N 种不同的形式和递归。 AFAIK Formsets 无法做到这一点。如果我错了,请告诉我。
  • 您是否希望一个表单类包含多个可调用的表单?或者您是否正在考虑使用不同选项即时生成的类?
  • 我相信这是可能的(尽管它会令人困惑并且需要大量工作)。但是你为什么不想这样做呢?您希望解决什么问题,因为可能有更简单的方法。

标签: python django forms recursion django-forms


【解决方案1】:

你应该试试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()

【讨论】:

【解决方案2】:

我不确定你到底想达到什么目的,但我必须解决一次关于动态表单的问题。

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

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

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

您可以将它们全部发送到模板。

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

如果你能多解释一下你的情况以及你为什么要这样做,对你和试图帮助你的人会更好,因为也许我的回答对你没有用。

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


在什么情况下你会需要这种“动态”表格吗?

你想获取什么样的信息?

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

您是否尝试根据某些信息创建多个表单?

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

【讨论】:

    【解决方案3】:

    乍一看,您的想法似乎很复杂。直接的问题是 - “为什么需要这样的功能?”。 99% 的任务可以用内置的 Django “砖块”来解决,另外 1% 的任务是“请硬编码”。此外,我可能会假设这种想法背后的问题也很复杂,最终用户很难理解。

    【讨论】:

      【解决方案4】:

      我认为您在考虑表单的方式与您应该考虑的方式不同。

      表单只是用于输入。如何处理它们取决于您。

      当然,您可以在表单上运行 is_valid,这将检查您分配的模型表单。令人敬畏的是您可以在同一个表单上检查多个模型表单。模型表单所需的数据将被处理,额外的数据将被忽略。如果 is_valid 失败,您仍然像往常一样将数据传回以进行更正。

      【讨论】:

      • 对于那些已经标记下来的人,我的回答仍然有效——尽管我没有给出示例代码,但我写的仍然是正确的。您可以在由多个模型表单同时处理的同一
        标记中拥有多个表单。 ModelForm 仅依赖于输入的“名称”属性来匹配您尝试在模型表单中处理的元素。
      • 我没有否决您的回答,但我想向您解释一些事情。如果您的答案被否决,这不是个人的(相信我,我已经受苦了)它只是社区根据问题对您的答案进行排名。是的,重要的是你的答案与问题相匹配,例如(一个极端的)即使是真的,如果你问我你会怎么想:“嘿,我怎么能写出制作咖啡的代码?” 和我的回答是:“是的,伙计,天空是蓝色的!” 没错,但是,你如何投票给这个答案?向上还是向下?
      猜你喜欢
      • 2016-03-04
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 2010-12-31
      • 2012-10-01
      • 1970-01-01
      相关资源
      最近更新 更多