Skip to main content
 首页 » 编程设计

python之Django:将一个表单放入一个表单(递归...)

2024年08月27日32zfyouxi

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

我的梦想是这样的:

  • 我有一个表现得像普通形式的形式:例如一个名为 SuperForm 的类
  • SuperForm可以包含几个范式,甚至(递归)SuperForms
  • 您可以将它绑定(bind)到数据(使其绑定(bind)),调用 is_valid() ...

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

更新

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

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

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

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

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

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

请您参考如下方法:

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