#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 и добавил его в основную форму.