J'ai juste ajouté ma propre version, après vérification de certains de ces pré-faites CBVs. J'ai particulièrement besoin de contrôler multiple formsets -> one parent
dans une vue unique avec chaque individu enregistrer des fonctions.
En gros, j'ai bourré le FormSet la liaison de données en get_named_formsets
fonction qui est appelée par get_context_data
et form_valid
.
Là, j'ai vérifier si tous les jeux de formulaires sont valides, et aussi regarder pour une méthode qui remplace un bon vieux formset.save()
par formset base de la coutume de l'épargne.
Le modèle rend formsets via
{% with named_formsets.my_specific_formset as formset %}
{{ formset }}
{{ formset.management_form }}
{% endwith %}
Je pense que je vais utiliser ce système régulièrement.
class MyView(UpdateView): # FormView, CreateView, etc
def get_context_data(self, **kwargs):
ctx = super(MyView, self).get_context_data(**kwargs)
ctx['named_formsets'] = self.get_named_formsets()
return ctx
def get_named_formsets(self):
return {
'followup': FollowUpFormSet(self.request.POST or None, prefix='followup'),
'action': ActionFormSet(self.request.POST or None, prefix='action'),
}
def form_valid(self, form):
named_formsets = self.get_named_formsets()
if not all((x.is_valid() for x in named_formsets.values())):
return self.render_to_response(self.get_context_data(form=form))
self.object = form.save()
# for every formset, attempt to find a specific formset save function
# otherwise, just save.
for name, formset in named_formsets.items():
formset_save_func = getattr(self, 'formset_{0}_valid'.format(name), None)
if formset_save_func is not None:
formset_save_func(formset)
else:
formset.save()
return http.HttpResponseRedirect('')
def formset_followup_valid(self, formset):
"""
Hook for custom formset saving.. useful if you have multiple formsets
"""
followups = formset.save(commit=False) # self.save_formset(formset, contact)
for followup in followups:
followup.who = self.request.user
followup.contact = self.object
followup.save()