Python Django:将表单放入表单(递归…)
我喜欢Django表单库,但如果表单可以包含表单,那就更好了 我的梦想是这样的:Python Django:将表单放入表单(递归…),python,django,forms,recursion,django-forms,Python,Django,Forms,Recursion,Django Forms,我喜欢Django表单库,但如果表单可以包含表单,那就更好了 我的梦想是这样的: 我有一个与普通表单类似的表单:例如一个名为SuperForm SuperForms可以包含多个标准格式,甚至(递归)SuperForms 您可以将其绑定到数据(使其绑定),调用是有效的() django或外部应用程序是否可以实现这一点 更新 我看到很多人不明白我想要什么。是我的错,我没有给出用例 用例:页面应该允许用户更新他的电子邮件和电话号码。电子邮件来自django.contrib.auth,电话号码来自我
- 我有一个与普通表单类似的表单:例如一个名为
SuperForm
可以包含多个标准格式,甚至(递归)SuperForms
SuperForms
- 您可以将其绑定到数据(使其绑定),调用
是有效的()
标记中。由于ModelForm
易于使用,我不想自己手工创建表单
我想要一个包含django.contrib.auth.models.User的ModelForm
和自定义模型的ModelForm
的容器
我不想自己循环这两种表单(在其他用例中可能有更多表单),并检查它们是否有效
如果我在容器上调用
is\u valid()
或save()
,就会调用表单的匹配方法。乍一看,您的想法似乎很复杂。直接的问题是“为什么需要这样的功能?”。99%的任务可以用内置的Django“砖块”解决,另外1%-“请硬编码”。此外,我可能认为这种想法背后的问题也很复杂,最终用户很难理解。我不确定您到底想实现什么,但我曾经解决过一个关于动态表单的问题
如果您有一个表单(或ModelForm
或任何您需要的),您可以根据需要在视图中初始化该表单多少次
如果您有一个名为MyForm
的表单,您可以在视图中执行以下操作:
... ...
form1 = MyForm(...)
form2 = MyForm(...)
form3 = MyForm(...)
... ...
你可以把它们全部发送到模板
此数量的表单不需要是静态的,您可以将大量“动态”表单添加到列表中,然后将表单列表发送到模板,并根据需要在模板中进行管理
如果你能多解释一下你的处境以及你为什么要这么做,对你和那些试图帮助你的人来说会更好,因为我的答案可能对你没用
无论如何,我强烈建议您检查,因为这是在一个模板中生成/管理动态表单的最佳方法
在哪种情况下,您需要这种“动态”表格 你想得到什么样的信息 您正在尝试动态创建对象吗 您是否试图根据某些信息创建多个表单
如何在模板/视图中管理这些“动态”表单 我认为你对形式的思考与你应该思考的不同 表格只是用来输入的。如何处理它们取决于您
确保您可以在表单上运行是有效的,这将对照您分配的modelform进行检查。最棒的是,您可以在同一表单上检查多个模型表单。模型表单所需的数据将被处理,多余的数据将被忽略。如果is_valid失败,您仍然会像通常需要更正的那样将数据传回 你应该试试看。通过这种方式,您将能够编写如下代码: 取自随包分发的示例
亲爱的否决此问题的用户:请告诉我您为什么不喜欢它,以及如何改进它。谢谢。我不确定你是否了解表单的工作原理。你看过表单集的文档了吗@Johndt6表单集只能对同一表单类执行N次。我想要N种不同的形式和递归。AFAIK表单集不能这样做。如果我错了,请告诉我。您是否希望一个表单类包含多个可调用的表单?或者您正在考虑一个可以使用不同选项动态生成的类吗?我相信这是可能的(尽管这会让人感到困惑,而且需要做很多工作)。但你为什么不这么做呢?您希望解决的问题是什么,因为可能有一种更简单的方法。对于那些记下这一点的人,我的答案仍然有效-尽管我没有给出示例代码,但我所写的仍然是正确的。可以在同一标记中包含多个表单,该标记由多个模型表单同时处理。ModelForm只依赖输入“name”属性来匹配您试图在模型表单中处理的元素。我没有否决您的答案,但我想向您解释一些事情。如果你的答案被否决,那不是针对个人的(相信我,我已经受苦了),而是社区根据问题对你的答案进行排名。是的,你的答案与问题相匹配很重要,例如(一个极端的问题),即使是真的,如果你问我:“嘿,我怎么能为煮咖啡写代码?”我的答案是:“是的,伙计,天是蓝的!”这是真的,但是,你怎么投票给这个答案呢?向上还是向下?看起来像是我在找的。谢谢。我发现还有其他表单库可以做这样的事情:例如
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()