2016-10-03 65 views
0

我有设置这样的产品对象的ModelForm形式添加作为字段属性:如何在Django的ModelForm

class ProductForm(forms.ModelForm): 
    compositon_choices = ((2L, u'Calcium (100mg)'), (3L, u'Iron (500mg)')) 
     composition_selection = forms.\ 
       MultipleChoiceField(widget=forms.CheckboxSelectMultiple,  
         choices=compositon_choices) 

    class Meta: 
     model = Product 
     fields = [ 
      'title', 'title_de', 'title_es', 'upc', 'description', 
      'description_en_gb', 'description_de', 
      'description_es', 'is_discountable', 'structure', 
      'unit_type', 'product_concentration',] 

     widgets = { 
      'structure': forms.HiddenInput() 
     } 

在上面的例子我扩展用MultipleChoiceField所述的ModelForm通过添加composition_selection现场(这工作):

我想composoition_selection是一个形式本身,而不是只是一个MultipleChoiceField:

class ProductComponentForm(forms.Form): 
    component_amount = forms.IntegerField() 
    component_name = forms.CharField() 

,然后转以这样的新形式结束ModelForm:

class ProductForm(forms.ModelForm): 
     composition_selection = ProductComponentForm() 

     class Meta: 
      model = Product 
      fields = [ 
       'title', 'title_de', 'title_es', 'upc', 'description', 
       'description_en_gb', 'description_de', 
       'description_es', 'is_discountable', 'structure', 
       'unit_type', 'product_concentration',] 

      widgets = { 
       'structure': forms.HiddenInput() 
      } 

但我无法得到这个工作。我想创建的这个ProductForm永远不会被渲染,也不会出现任何东西。我做错了什么或缺少什么?用SubForm扩展ModelForm的最佳方式是什么?

+0

它的目的是什么?要将'ProductForm'中的'component_amount'和'component_name'作为两个字段? –

+0

产品可以有各种产品组件。每个ProductComponent都有一个名称和一个金额。我的目标是呈现一个表单,您可以通过复选框选择各种ProductComponents,并在选择框旁边的整数字段中添加金额。 – matyas

回答

0

最后我明白我做错了什么。为了使Django中的子表单需要formset。 在我的情况下,我需要两种不同类型的formset,因为我有两种不同的关系,我想从一种形式改变。

  • 一对多的关系
  • 多对多的关系

根据所述关系型人希望从单个表单中编辑的关系,并且其侧有不同的方法:

有inlineformset_factory: https://docs.djangoproject.com/el/1.10/topics/forms/modelforms/#inline-formsets。这种类型的表单集是用来当一个人想如果一个人想一个一个的一面编辑以一对多的关系 modelformset_factory习惯了一个的许多侧编辑一对多的关系

https://docs.djangoproject.com/el/1.10/topics/forms/modelforms/#model-formsets

可以创建一个model_formset,然后将此formset添加到主窗体的主formset。

当想要在单个表单中编辑多对多关系时,可以使用多对多关系的中间表创建inline_formset_factory。

这个formset可以添加到主窗体中。

对于我上面描述的用例,我最终使用了model_formset_factory并将其添加到主窗体中。