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,
)