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
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 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\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
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
account\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)
Pouvez vous m'aider SVP ?
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)
Partager