/ / Como adicionar um formulário como atributo de campo em um ModelForm do django - python, django, django-models, django-forms

Como adicionar um formulário como atributo de campo em um ModelForm do django - python, django, django-models, django-forms

Eu tenho um ModelForm para um objeto Produto configurado assim:

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

No exemplo acima, estendi o ModelForm com um MultipleChoiceField adicionando o campo composition_selection (isso funciona):

Gostaria que o composoition_selection fosse um formulário em si e não apenas um MultipleChoiceField:

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

e depois estenda o ModelForm com este novo formulário como este:

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

Mas não consigo fazer isso funcionar. Este ProductForm que eu quero criar nunca é renderizado e nada aparece. Estou fazendo algo errado ou faltando alguma coisa? Qual seria a melhor maneira de estender um ModelForm com um SubForm?

Respostas:

0 para resposta № 1

Finalmente entendo o que fiz de errado. Para criar subformulários no Django, é necessário criar conjuntos de formulários. No meu caso, eu precisava de dois tipos diferentes de conjuntos de formulários, porque tinha dois relacionamentos diferentes que queria mudar de um formulário.

  • um para muitos relacionamento
  • muitos para muitos relacionamento

dependendo de qual lado do relacionamento e qual tipo de relacionamento se deseja editar em um único formulário, existem abordagens diferentes:

Existe o inlineformset_factory: https://docs.djangoproject.com/el/1.10/topics/forms/modelforms/#inline-formsets . Esse tipo de conjunto de formulários é usado quando se deseja editar o muitos lado de um para muitos relacionamento

Se alguém quiser editar o lado de um relacionamento entre muitos, o modelformset_factory é usado: https://docs.djangoproject.com/el/1.10/topics/forms/modelforms/#model-formsets

pode-se criar um model_formset e depois adicionar esse formset ao formset principal do formulário principal.

quando se deseja editar um relacionamento muitos para muitos em um único formulário, um inline_formset_factory pode ser criado com a tabela intermediária do relacionamento muitos para muitos.

este formset que pode ser adicionado ao formulário principal.

Para o meu caso de uso que descrevi acima, acabei usando um model_formset_factory e o adicionei ao formulário principal.