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

2024-09-28 22:24:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个产品对象的模型,设置如下:

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字段,用multipleechoicefield扩展了ModelForm(这是有效的):

我希望组合选择本身是一种形式,而不仅仅是多回声场:

^{pr2}$

然后使用如下新表单扩展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永远不会呈现,也不会显示任何内容。我是做错了什么事还是遗漏了什么?用子窗体扩展ModelForm的最佳方法是什么?在


Tags: modelestitledeformsdescriptionstructuremeta
1条回答
网友
1楼 · 发布于 2024-09-28 22:24:06

我终于明白我做错了什么。要在Django中生成子表单,需要表单集。 在我的例子中,我需要两种不同类型的表单集,因为我有两种不同的关系,我想从一个表单中改变它们。在

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

根据关系的哪一方以及要在单个表单中编辑的关系类型,有不同的方法:

有一个inlineformset_工厂: https://docs.djangoproject.com/el/1.10/topics/forms/modelforms/#inline-formsets。这种类型的表单集用于编辑一对多关系的

如果要编辑一对多关系的一侧 使用modelformset_工厂: https://docs.djangoproject.com/el/1.10/topics/forms/modelforms/#model-formsets

您可以创建一个模型表单集,然后将此表单集添加到主表单的主表单集。在

当想要在单个表单中编辑多对多关系时,可以使用多对多关系的中间表创建内联的“表单集”工厂。在

此窗体集可以添加到主窗体。在

对于我上面描述的用例,我最终使用了一个model_formset_工厂,并将其添加到主窗体中。在

相关问题 更多 >