Editer modelchoicefield dans un formset
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:
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:
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:
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:
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 ?