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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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, )
Partager