Как добавить форму в качестве атрибута поля в модельной форме django

#python #django #django-models #django-forms

#python #django #django-модели #django-forms

Вопрос:

У меня есть модельная форма для объекта продукта, настроенная следующим образом:

 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, добавив поле composition_selection (это работает):

Я бы хотел, чтобы composoition_selection был самой формой, а не просто MultipleChoiceField:

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

а затем расширить модельформу этой новой формой следующим образом:

 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, которую я хочу создать, никогда не отображается, и ничего не отображается. Я делаю что-то не так или что-то упускаю? Каков наилучший способ расширить модельформу с помощью подчиненной формы?

Комментарии:

1. Какова его цель? Иметь component_amount и component_name в ProductForm качестве еще двух полей?

2. Продукт может иметь различные компоненты продукта. У каждого ProductComponent есть имя и сумма. Моей целью было бы отобразить форму, в которой можно выбирать различные компоненты продукта с помощью флажка и добавлять сумму в целочисленное поле рядом с полем выбора.

Ответ №1:

Наконец-то я понимаю, что я сделал не так. Для создания подчиненных форм в Django нужны наборы форм. В моем случае мне понадобились два разных типа наборов форм, потому что у меня было два разных отношения, которые я хотел изменить из одной формы.

  • отношение один ко многим
  • отношение многие ко многим

в зависимости от того, какую сторону отношений и какой тип отношений нужно редактировать из одной формы, существуют разные подходы:

Существует 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, а затем добавить этот набор форм в основной набор форм основной формы.

когда нужно отредактировать отношение «многие ко многим» в одной форме, можно создать inline_formset_factory с промежуточной таблицей отношения «многие ко многим».

этот набор форм можно добавить в основную форму.

Для моего варианта использования, который я описал выше, я закончил тем, что использовал model_formset_factory и добавил его в основную форму.