Erikbwork et moi avons tous deux rencontré le problème suivant : on ne peut inclure qu'un seul modèle dans une vue générique basée sur une classe. J'ai trouvé une façon similaire d'aborder le problème comme Miao, mais plus modulaire.
J'ai écrit un Mixin pour que vous puissiez utiliser tous les génériques Class Based Views. Définir le modèle, les champs et maintenant aussi child_model et child_field - et ensuite vous pouvez envelopper les champs des deux modèles dans un tag comme Zach le décrit.
class ChildModelFormMixin:
''' extends ModelFormMixin with the ability to include ChildModelForm '''
child_model = ""
child_fields = ()
child_form_class = None
def get_child_model(self):
return self.child_model
def get_child_fields(self):
return self.child_fields
def get_child_form(self):
if not self.child_form_class:
self.child_form_class = model_forms.modelform_factory(self.get_child_model(), fields=self.get_child_fields())
return self.child_form_class(**self.get_form_kwargs())
def get_context_data(self, **kwargs):
if 'child_form' not in kwargs:
kwargs['child_form'] = self.get_child_form()
return super().get_context_data(**kwargs)
def post(self, request, *args, **kwargs):
form = self.get_form()
child_form = self.get_child_form()
# check if both forms are valid
form_valid = form.is_valid()
child_form_valid = child_form.is_valid()
if form_valid and child_form_valid:
return self.form_valid(form, child_form)
else:
return self.form_invalid(form)
def form_valid(self, form, child_form):
self.object = form.save()
save_child_form = child_form.save(commit=False)
save_child_form.course_key = self.object
save_child_form.save()
return HttpResponseRedirect(self.get_success_url())
Exemple d'utilisation :
class ConsumerRegistrationUpdateView(UpdateView):
model = Registration
fields = ('firstname', 'lastname',)
child_model = ConsumerProfile
child_fields = ('payment_token', 'cart',)
Ou avec ModelFormClass :
class ConsumerRegistrationUpdateView(UpdateView):
model = Registration
fields = ('firstname', 'lastname',)
child_model = ConsumerProfile
child_form_class = ConsumerProfileForm
C'est fait. J'espère que cela aidera quelqu'un.
0 votes
Duplicata possible de Django : plusieurs modèles dans un modèle à l'aide de formulaires
0 votes
Il s'agit d'un cas particulier (utilisation de
ModelForm
) de python - django soumettre deux formulaires différents avec un seul bouton de soumission - Stack Overflow