Bonjour j'arrive pas a afficher le contenu des modelchoicefield dans un formset lors de l'édition (je me suis inspiré de ce post https://whoisnicoleharris.com/2015/0...-formsets.html)
si je remplace le ModelChoiceField par un form.CharField tout fonctionne correctement
ci dessous mon code:
demande\views.py
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
33
34
35
36
37
38
39
40
41
42
 
def demande(request):
    user = request.user
    corpsorigine = user.profile.corps
    uz = get_object_or_404(session, active=True, destine = user.profile.corps)
    choice_links = choix.objects.filter(demandeur = user, session = uz )
    link_data = [{'etabz': l}
        for l in choice_links]
    LinkFormSet = formset_factory(LinkForm, formset=BaseLinkFormSet, extra=1)
    if request.method == 'POST':
        link_formset = LinkFormSet(request.POST,form_kwargs={'dbz':corpsorigine })
        if link_formset.is_valid():
            new_links = []
            for link_form in link_formset:
                dona = link_form.cleaned_data.get('etabz')
                try:
                    univ = dona.univ
                    etablissementa = dona.etablissement
                except:
                    messages.error(request, 'Une exception à provoqué une erreur. veuillez ré-essayer ultérieurement')
                    return redirect(reverse('blog:post_list'))
 
                if  etablissementa and univ:
                    new_links.append(choix(demandeur = user,session=uz.annee_session, etablissement_demande=etablissementa, universite_demande=univ))
            try:
                with transaction.atomic():
                    UserLink = choix.objects.all()
                    UserLink.filter(session= uz.annee_session,demandeur = user).delete()
                    UserLink.bulk_create(new_links)
                    messages.success(request, 'Votre demande à été correctement saisie/mis à jour.')
                    return redirect(reverse('blog:post_list'))
 
            except IntegrityError:  # If the transaction failed
                messages.error(request, 'Une exception à provoqué une erreur. veuillez ré-essayer ultérieurement')
                return redirect(reverse('blog:post_list'))
    else:
        link_formset = LinkFormSet(initial=link_data,form_kwargs={'dbz':corpsorigine })
    context = {
        'uz':uz,
        'link_formset': link_formset,
    }
    return render(request, 'edit_pro.html', context)
demande\forms.py
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
class LinkForm(forms.Form):
    etabz = forms.ModelChoiceField(empty_label="Choisir un établissement",\
    queryset=Etablissement.objects.all().order_by('univ','etablissement').distinct(),
                             )
    # etabz = forms.CharField()
    def __init__(self, *args, **kwargs):
        dbz = kwargs.pop("dbz", None)
        reco = kwargs.pop("reco", None)
        super(LinkForm, self).__init__(*args, **kwargs)
        # self.fields["etabz"] = forms.ModelChoiceField(empty_label="Choisir un établissement", \
        #                                               queryset=etablissement.objects.all().order_by('univ',
        #                                                                                             'etablissement').distinct())
 
        if dbz:
           self.fields["etabz"].queryset = Etablissement.objects.filter(univ__corps=dbz)
 
 
 
class BaseLinkFormSet(BaseFormSet):
    def clean(self):
        """
        Adds validation to check that no two links have the same anchor or URL
        and that all links have both an anchor and URL.
        """
        if any(self.errors):
            return
 
        anchors = []
        urls = []
        duplicates = False
 
        for form in self.forms:
            if form.cleaned_data:
                dona = form.cleaned_data.get('etabz')
                # univ = dona.univ
                anchor = dona.etablissement
                # Check that no two links have the same anchor or URL
                if anchor :
                    if anchor in anchors:
                        duplicates = True
                    anchors.append(anchor)
 
                    # if url in urls:
                    #     duplicates = True
                    # urls.append(url)
 
                if duplicates:
                    raise forms.ValidationError(
                        'Vous ne pouvez choisir le même établissement plusiuers fois.',
                        code='duplicate_etab'
                    )
 
    def __init__(self, *args, **kwargs):
        super(BaseLinkFormSet, self).__init__(*args, **kwargs)
        for form in self.forms:
            form.empty_permitted = False
demande\models.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
class choix(models.Model):
    demandeur = models.ForeignKey(User, related_name='user_choice')
    # universite_demande = models.ForeignKey(universite, related_name='universite_choice')
    session = models.CharField(max_length=250)
    universite_demande = models.CharField(max_length=250)
    etablissement_demande = models.CharField(max_length=250)
    class Meta:
        unique_together = ('demandeur', 'session','etablissement_demande')
    def __str__(self):
        return "{} de l'universite {}".format(self.etablissement_demande ,self.universite_demande)
account\models.py
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
 
class universite (models.Model):
    gouvernorat= models.CharField(max_length=250)
    universite = models.CharField(max_length=250)
    universite_ar = models.CharField(max_length=250)
    corps =  models.CharField(max_length=20, choices=corps_CHOICES)
    class Meta:
        unique_together = ('gouvernorat', 'universite','corps')
    def __str__(self):
        return self.universite
 
class Etablissement(models.Model):
    etablissement = models.CharField(max_length=250)
    etablissement_ar = models.CharField(max_length=250)
    univ = models.ForeignKey(universite, related_name='etab_universites')
    def __str__(self):
        return "{} de l'universite {}".format(self.etablissement,self.univ)
Pouvez vous m'aider SVP ?