2016-10-03 2 views
0

У меня есть ModelForm для объекта Product создан следующим образом:Как добавить форму в качестве атрибута поля в Джанго 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() 
     } 

В приведенном выше примере, я расширил ModelForm с MultipleChoiceField путем добавления composition_selection поле (это работает):

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

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

, а затем вн end 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 с помощью SubForm?

+0

Что это за цель? Чтобы иметь 'component_amount' и' component_name' в 'ProductForm' как еще два поля? –

+0

Продукт может иметь различные ProductComponents. Каждый ProductComponent имеет имя и сумму. Моя цель состояла бы в том, чтобы отобразить форму, в которой можно выбрать различные компоненты ProductComponents, и добавить сумму в целочисленное поле рядом с полем выбора. – matyas

ответ

0

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

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

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

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

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

этот набор форм, который может быть добавлен в основную форму.

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