如何在django ModelForm中添加表单作为字段属性

时间:2016-10-03 08:30:57

标签: python django django-models django-forms

我有一个ModelForm,用于设置如下的Product对象:

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()
        }

在上面的例子中,我通过添加composition_selection字段扩展了ModelForm和MultipleChoiceField(这有效):

我希望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的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

最后我理解我做错了什么。要在Django中创建子表单,需要formsets。 在我的情况下,我需要两种不同类型的表单集,因为我有两个不同的关系,我想从一个表单更改。

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

取决于关系的哪一方以及想要在单个表单中编辑哪种关系类型,有不同的方法:

有inlineformset_factory: https://docs.djangoproject.com/el/1.10/topics/forms/modelforms/#inline-formsets。当想要编辑一对多关系的侧时,会使用这种类型的formset

如果想要编辑一对多关系的一方 使用了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并将其添加到主窗体中。