Django inlineformset: Update ne fonctionne pas
Bonjour,
j'utilise pour la première fois les inlineformset django et je galère un peu.
J'ai suivi ce tutoriel pour implémenter les sous-formulaires nichés.
La création (CreatView) fonctionnent mais pas la mise à jour (UpdateView) et je ne comprends pas.
Il semble que les instances de sous-formulaire application ne sont jamais valid(is_valid()=False) et le sous-formulaire n'est donc pas mis à jour...
En affichant les erreurs, je vois que le problème vient de la clé primaire du model Application utilisé pour le sous-formulaire niché : errors [{'app_ide': ['This field is required.']}, {}, {}, {}]
D'avance merci pour votre aide,
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
class UtilisateurUpdateView(UpdateView):
model = Utilisateur
fields = ['uti_nom','uti_pre','uti_mai','uti_sit','uti_pro']
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
if self.request.POST:
data["utilisateur"] = self.request.user.username
data["application"] = ApplicationFormset(self.request.POST, instance=self.object)
else:
data["application"] = ApplicationFormset(instance=self.object)
return data
def form_valid(self, form):
context = self.get_context_data()
application = context["application"]
self.object = form.save()
self.object.save()
if application.is_valid(): # *****is_valid() retourne False****
application.instance = self.object
print('application.instance',application.instance)
application.app_app_nom = application.instance.cleaned_data['app_app_nom']
application.app_dro = application.instance.cleaned_data['app_dro']
application.app_log = context["utilisateur"]
application.uti_ide = 1
application.save()
return super().form_valid(form)
def get_success_url(self):
return reverse("project:index") |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
NAME = Thesaurus.options_list(2,'fr')
ACCESS = Thesaurus.options_list(3,'fr')
ApplicationFormset = inlineformset_factory(
Utilisateur, Application,
fields=('app_app_nom','app_dro'),
widgets={
'app_app_nom': forms.Select(choices=NAME),
'app_dro': forms.Select(choices=ACCESS)
},
extra=3,
can_delete=True,
) |