如何为Django ModelForm创建子窗体

如何为Django ModelForm创建子窗体,django,modelform,Django,Modelform,我不知道要添加多少子表单要添加多少子表单是个问题。我希望在单击按钮时创建要保存的子窗体,并希望选择要在主窗体中使用的已保存数据 我的模型 class Teste(models.Model): name = models.CharField(max_length=255) parent_institution_name = models.CharField(max_length=255) laboratory_departament = models.CharField(max

我不知道要添加多少子表单要添加多少子表单是个问题。我希望在单击按钮时创建要保存的子窗体,并希望选择要在主窗体中使用的已保存数据

我的模型

class Teste(models.Model):

   name = models.CharField(max_length=255)
   parent_institution_name = models.CharField(max_length=255)
   laboratory_departament = models.CharField(max_length=255, null=True, 
   blank=True, verbose_name="Laboratório")
   cep = models.CharField(max_length=255, verbose_name="Cep")
   cnpj = models.CharField(max_length=255, verbose_name="CNPJ")
   lat = models.FloatField(blank=True, null=True)
   lng = models.FloatField(blank=True, null=True)
   institution_name = models.CharField(max_length=255, null=False, 
   verbose_name="Nome da instituição")
   parent_institution_name = models.CharField(max_length=255, blank=True, 
   null=True, verbose_name="Nome da instituição vinculada")
   coordinator = models.CharField(max_length=255, verbose_name="Pessoa 
   Responsavel")
   email = models.CharField(max_length=255, verbose_name="E-mail")
   website = models.CharField(max_length=255, blank=True, null=True, 
   verbose_name="Website")
   rad_operating_time = models.IntegerField(verbose_name="Tempo de atuação 
   ")
   research_line = models.ManyToManyField('researcher.ResearchLines')
我的模型 类TestFormforms.ModelForm: 类元:

        model = Test
        exclude = ('employee_number', ' revenues', 'filter_grade', 'grade', ' 
        knowledge_grade',
    'application_grade', 'ie_grade', ' ia_grade', 'final_grade', 'inactive', 'last_coordinator_access', ' hr_count',
    'hr_returned', ' match_hr_count', 'general_grade', 'lat', 'lng'
    'tokens', 'iso_certification', 'other_certification', 'researchers', 'thematic_network',
    )


    widgets ={
        'name':forms.TextInput(attrs={
            'class':'form-control',
            'placeholder': 'Nome da UBC'
        }),
        'parent_institution_name': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Nome da Instituição à qual a UBC é vinculada'
        }),
        'laboratory_departament': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Laboratório/Departamento'
        }),
        'cep': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'CEP'
        }),
        'cnpj': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'CNPJ'
        }),
        'institution_name': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Nome da instituição'
        }),
        'coordinator': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Pessoa Responsável'

        }),
        'email': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'E-mail'
        }),
        'website': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Website'
        }),
        'rad_operating_time': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Tempo de atuação em projetos de P&D+I'
        }),
        'phone': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder': 'Telefone'
        }),
        'partner_category': forms.RadioSelect(),

        'main_product':forms.CheckboxSelectMultiple( attrs={
            'type':'checkbox'
        }),        
    }
我的表单看起来如何,最后一个输入显示了子表单添加数据的位置

这里是一个我使用内联表单集的示例,它实质上是将两个表单合并到一个显示的表单中。表单集是服务表单,冲头表单,我的意图是冲头是表单中的表单

VIEWS.PY是最有影响力的部分

FORMS.PY

MODELS.PY


下面是一个例子,我使用内联表单集,它本质上是将两个表单合并成一个显示的表单。表单集是服务表单,冲头表单,我的意图是冲头是表单中的表单

VIEWS.PY是最有影响力的部分

FORMS.PY

MODELS.PY


Jaberwocky这是我的代码,我必须为我还在学习的代码提前说声抱歉

class Ubc(models.Model):
    """ Table Ubc """
    name = models.CharField(verbose_name="Nome da instituição", max_length=255, null=False)
    laboratory_departament = models.CharField(max_length=255, null=True, blank=True, verbose_name="Laboratório")
    cep = models.CharField(max_length=255, verbose_name="Cep", null=True)
    cnpj = models.CharField(max_length=255, verbose_name="CNPJ", null=True)
    lat = models.FloatField(blank=True, null=True)
    lng = models.FloatField(blank=True, null=True)
    street = models.CharField(max_length=255, verbose_name="Endereco", null=True, blank=True)
    uf = models.CharField(max_length=255, verbose_name="UF", null=True, blank=True)
    city = models.CharField(max_length=255, verbose_name="City", null=True, blank=True)
    parent_institution_name = models.CharField(verbose_name="Nome da instituição vinculada", max_length=255, blank=True, null=True)
    coordinator = models.CharField(max_length=255, verbose_name="Pessoa Responsavel")
    email = models.CharField(max_length=255, verbose_name="E-mail")
    website = models.CharField(max_length=255, blank=True, null=True, verbose_name="Website")
    rad_operating_time = models.IntegerField(verbose_name="Tempo de atuação em projetos de P&D+I")

    phone = models.CharField(max_length=255, verbose_name="Telefone", null=True)
    inactive = models.NullBooleanField(verbose_name="Inativo", default=False, null=True)
    partner_category = models.ForeignKey('PartnerSubCategory', on_delete=models.CASCADE)
    parent = models.ForeignKey('Company', blank=True, null=True, on_delete=models.CASCADE)
    general_grade = models.ForeignKey('GeneralGrade', blank=True, null=True, on_delete=models.CASCADE)
    main_product = models.ManyToManyField('MainProductUbc', verbose_name="Qual o tipo de produto e/ou servico que a UBC fornece (produto, processo, mudanca organizacional)")
    tokens = models.ManyToManyField('ubc.Token', blank=True, related_name='tokens')
    activity_branch = models.ForeignKey('ActivityBranch', verbose_name="Ramo de Atividade (CNAE)", null=True, on_delete=models.CASCADE)      
    researchers = models.ManyToManyField('researcher.Researcher', related_name='researchers', through='researcher.ResearcherUbc', blank=True)    
    research_line = models.ManyToManyField('researcher.ResearchLines',related_name='ubc_lines', blank=True)  


class ResearchLines(models.Model):
    title = models.CharField(verbose_name="Descrição da Linha de Pesquisa", max_length=255, blank=True, null=True)
    ubc = models.ForeignKey('ubc.Ubc', on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    updtaed = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name_plural = 'Research Line'

    def __str__(self):
        return self.title
views.py

def ubc_register(request):
    if request.method == "POST":
        form = UbcForm(request.POST or None)
        if form.is_valid():
            form = form.save(commit=False)
            formset = LinesFormSet(request.POST, request.FILES, instance=form)
            if formset.is_valid():
                form.save()
                formset.save()         
            return HttpResponseRedirect(reverse('index'))
    else:
        form = UbcForm(prefix="form")
        formset = LinesFormSet(prefix="formset")
        context = {
            'form':form,
            'formset':formset
        }
        return render(request, 'accounts/ubc_form.html', context)
forms.py

class UbcForm(forms.ModelForm):


    class Meta:

        research_line = forms.ModelMultipleChoiceField(queryset=ResearchLines.objects.all())

        model = Ubc
        exclude = ('employee_number', ' revenues', 'filter_grade', 'grade', 
        ' knowledge_grade',
        'application_grade', 'ie_grade', ' ia_grade', 'final_grade', 
        'inactive', 'last_coordinator_access', ' hr_count',
        'hr_returned', ' match_hr_count', 'general_grade', 'lat', 'lng'
        'tokens', 'iso_certification', 'other_certification', 'researchers', 
        'thematic_network',
     )


        widgets ={
            'name':forms.TextInput(attrs={
            'class':'form-control',
            'placeholder': 'Nome da UBC'
        }),
            'parent_institution_name': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Nome da Instituição à qual a UBC é vinculada'
        }),
            'laboratory_departament': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Laboratório/Departamento'
        }),            
            'cnpj': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'CNPJ'
        }),
            'institution_name': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Nome da instituição'
        }),
            'coordinator': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Pessoa Responsável'

        }),
            'email': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'E-mail'
        }),
            'website': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Website'
        }),
            'rad_operating_time': forms.NumberInput(attrs={
            'class':'form-control',
            'placeholder':'Tempo de atuação em projetos de P&D+I'
        }),
            'phone': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder': 'Telefone'
        }),
            'partner_category': forms.RadioSelect(),

            'main_product':forms.CheckboxSelectMultiple( attrs={
            'type':'checkbox'
        }),   
            'activity_branch':forms.Select( attrs={
            'class':'form-control'
        }),
            'research_line':forms.TextInput(attrs={
            'class':'form-control'
        }),

            'cep': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'CEP'
        }),
            'street': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Endereço'
        }),
            'city': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Cidade'
        }),
            'uf': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'UF'
        }),


    }

class ResearchLineForm(forms.ModelForm):
    class Meta:
        model = ResearchLines
        fields = ('title', )

        widgets = {
            'title':forms.TextInput(attrs={
            'class':'form-control'
        })
    }

class AddressForm(forms.ModelForm):
    model = Address
    fields = '__all__'


LinesFormSet = inlineformset_factory(
    Ubc,
    ResearchLines,
    fields=('title', ),
    extra=1,
    widgets = {
        'title':forms.TextInput(attrs={
            'class':'form-control'
    })
}
)
在my form.html的内部,使用来自django dynamic formset的formset标记和脚本生成新表单

{{formset.management_form}}
{% for form in formset %}                
     <div class="link-formset">
         {{ form }}                                                           
     </div>
 {% endfor %}


<script>
    $('.link-formset').formset({
        addText: 'add link',
        deleteText: 'remove'
    });
</script>

Jaberwocky这是我的代码,我必须为我还在学习的代码提前说声抱歉

class Ubc(models.Model):
    """ Table Ubc """
    name = models.CharField(verbose_name="Nome da instituição", max_length=255, null=False)
    laboratory_departament = models.CharField(max_length=255, null=True, blank=True, verbose_name="Laboratório")
    cep = models.CharField(max_length=255, verbose_name="Cep", null=True)
    cnpj = models.CharField(max_length=255, verbose_name="CNPJ", null=True)
    lat = models.FloatField(blank=True, null=True)
    lng = models.FloatField(blank=True, null=True)
    street = models.CharField(max_length=255, verbose_name="Endereco", null=True, blank=True)
    uf = models.CharField(max_length=255, verbose_name="UF", null=True, blank=True)
    city = models.CharField(max_length=255, verbose_name="City", null=True, blank=True)
    parent_institution_name = models.CharField(verbose_name="Nome da instituição vinculada", max_length=255, blank=True, null=True)
    coordinator = models.CharField(max_length=255, verbose_name="Pessoa Responsavel")
    email = models.CharField(max_length=255, verbose_name="E-mail")
    website = models.CharField(max_length=255, blank=True, null=True, verbose_name="Website")
    rad_operating_time = models.IntegerField(verbose_name="Tempo de atuação em projetos de P&D+I")

    phone = models.CharField(max_length=255, verbose_name="Telefone", null=True)
    inactive = models.NullBooleanField(verbose_name="Inativo", default=False, null=True)
    partner_category = models.ForeignKey('PartnerSubCategory', on_delete=models.CASCADE)
    parent = models.ForeignKey('Company', blank=True, null=True, on_delete=models.CASCADE)
    general_grade = models.ForeignKey('GeneralGrade', blank=True, null=True, on_delete=models.CASCADE)
    main_product = models.ManyToManyField('MainProductUbc', verbose_name="Qual o tipo de produto e/ou servico que a UBC fornece (produto, processo, mudanca organizacional)")
    tokens = models.ManyToManyField('ubc.Token', blank=True, related_name='tokens')
    activity_branch = models.ForeignKey('ActivityBranch', verbose_name="Ramo de Atividade (CNAE)", null=True, on_delete=models.CASCADE)      
    researchers = models.ManyToManyField('researcher.Researcher', related_name='researchers', through='researcher.ResearcherUbc', blank=True)    
    research_line = models.ManyToManyField('researcher.ResearchLines',related_name='ubc_lines', blank=True)  


class ResearchLines(models.Model):
    title = models.CharField(verbose_name="Descrição da Linha de Pesquisa", max_length=255, blank=True, null=True)
    ubc = models.ForeignKey('ubc.Ubc', on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    updtaed = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name_plural = 'Research Line'

    def __str__(self):
        return self.title
views.py

def ubc_register(request):
    if request.method == "POST":
        form = UbcForm(request.POST or None)
        if form.is_valid():
            form = form.save(commit=False)
            formset = LinesFormSet(request.POST, request.FILES, instance=form)
            if formset.is_valid():
                form.save()
                formset.save()         
            return HttpResponseRedirect(reverse('index'))
    else:
        form = UbcForm(prefix="form")
        formset = LinesFormSet(prefix="formset")
        context = {
            'form':form,
            'formset':formset
        }
        return render(request, 'accounts/ubc_form.html', context)
forms.py

class UbcForm(forms.ModelForm):


    class Meta:

        research_line = forms.ModelMultipleChoiceField(queryset=ResearchLines.objects.all())

        model = Ubc
        exclude = ('employee_number', ' revenues', 'filter_grade', 'grade', 
        ' knowledge_grade',
        'application_grade', 'ie_grade', ' ia_grade', 'final_grade', 
        'inactive', 'last_coordinator_access', ' hr_count',
        'hr_returned', ' match_hr_count', 'general_grade', 'lat', 'lng'
        'tokens', 'iso_certification', 'other_certification', 'researchers', 
        'thematic_network',
     )


        widgets ={
            'name':forms.TextInput(attrs={
            'class':'form-control',
            'placeholder': 'Nome da UBC'
        }),
            'parent_institution_name': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Nome da Instituição à qual a UBC é vinculada'
        }),
            'laboratory_departament': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Laboratório/Departamento'
        }),            
            'cnpj': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'CNPJ'
        }),
            'institution_name': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Nome da instituição'
        }),
            'coordinator': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Pessoa Responsável'

        }),
            'email': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'E-mail'
        }),
            'website': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Website'
        }),
            'rad_operating_time': forms.NumberInput(attrs={
            'class':'form-control',
            'placeholder':'Tempo de atuação em projetos de P&D+I'
        }),
            'phone': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder': 'Telefone'
        }),
            'partner_category': forms.RadioSelect(),

            'main_product':forms.CheckboxSelectMultiple( attrs={
            'type':'checkbox'
        }),   
            'activity_branch':forms.Select( attrs={
            'class':'form-control'
        }),
            'research_line':forms.TextInput(attrs={
            'class':'form-control'
        }),

            'cep': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'CEP'
        }),
            'street': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Endereço'
        }),
            'city': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'Cidade'
        }),
            'uf': forms.TextInput(attrs={
            'class':'form-control',
            'placeholder':'UF'
        }),


    }

class ResearchLineForm(forms.ModelForm):
    class Meta:
        model = ResearchLines
        fields = ('title', )

        widgets = {
            'title':forms.TextInput(attrs={
            'class':'form-control'
        })
    }

class AddressForm(forms.ModelForm):
    model = Address
    fields = '__all__'


LinesFormSet = inlineformset_factory(
    Ubc,
    ResearchLines,
    fields=('title', ),
    extra=1,
    widgets = {
        'title':forms.TextInput(attrs={
            'class':'form-control'
    })
}
)
在my form.html的内部,使用来自django dynamic formset的formset标记和脚本生成新表单

{{formset.management_form}}
{% for form in formset %}                
     <div class="link-formset">
         {{ form }}                                                           
     </div>
 {% endfor %}


<script>
    $('.link-formset').formset({
        addText: 'add link',
        deleteText: 'remove'
    });
</script>


Django formset谢谢你的回答,我一直在互联网上搜索,但我没有找到可以将ModelForm与formset混合使用的东西。我可以同时使用这两种吗?可以。当我回到办公室时,我会给你一个我正在做的东西的样本。这看起来很复杂,但最后很简单。非常感谢你的帮助。Django formset谢谢你的回答,我一直在互联网上搜索,但我没有找到可以将ModelForm与formset混合的东西。我可以同时使用这两种吗?可以。当我回到办公室时,我会给你一个我正在做的东西的样本。这看起来很复杂,但最后还是很简单。非常感谢你的帮助。非常感谢你的帮助,但我在添加时遇到了一个错误。它不会保存所有的表单集,只保存最后一个表单集。你的代码看起来非常好,很有帮助,但是如果我需要使用中间表的多个表单呢。例如:我有一个人和电话,一个人可以有很多电话,一个电话可以链接到很多人。因此,我有了一个PersonPhone中间表。感谢您对我的帮助,但是我在添加时遇到了一个错误。它不会保存所有的表单集,只保存最后一个表单集。您的代码看起来非常好,非常有用,但是如果我想使用中间表,那么会发生什么呢。例如:我有一个人和电话,一个人可以有很多电话,一个电话可以链接到很多人。因此,我有一个PersonPhone中间表。显示您的views.py和forms.py。您也可能会因为发布方式而被否决。更新您的主要帖子,而不是通过回复帖子添加。对不起,我是新使用stackoverflowShow your views.py和forms.py的人。您也可能会因为发布自己的方式而被否决。更新你的主要帖子,而不是通过回复帖子添加。对不起,我是使用stackoverflow的新手