IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Django Python Discussion :

Editer modelchoicefield dans un formset


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Par défaut 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 : 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 ?

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 193
    Par défaut
    Bonjour,

    Tu as des messages d'erreur ?

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bonjour,

    Tu as des messages d'erreur ?
    Bonjour fred,
    Non pas de messages d'erreur, il me ramène le bon nombre de formset mais avec les empty label au lieu des initial value.
    Je crois qu'il faut préciser au niveau de def __init__ de la classe class LinkForm que le champ 'etabz' doit avoir comme valeur initiale l'instance passée dans la view mais je ne sais pas comment le faire

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 193
    Par défaut
    Citation Envoyé par paskal++ Voir le message
    Bonjour fred,
    Non pas de messages d'erreur, il me ramène le bon nombre de formset mais avec les empty label au lieu des initial value.
    Je crois qu'il faut préciser au niveau de def __init__ de la classe class LinkForm que le champ 'etabz' doit avoir comme valeur initiale l'instance passée dans la view mais je ne sais pas comment le faire
    Tu as regardé de ce côté du tuto ?

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Par défaut
    Bonjour Fred,
    Merci pour votre réponse,
    oui je l'ai fait (ligne 37 de la view). peut être que le fait que initial (link_data) est chargé par des données d'une table (choix) et que le ModelChoiceField du form (etabz) a un queryset basé sur une autre table (Etablissement, bien que les données sont de même schéma) pose problème ?

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Par défaut
    Up
    une idée ? une suggestion ?

Discussions similaires

  1. J-EDIT - Boucle dans un fichier XML
    Par vr_brandon dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 08/04/2013, 11h33
  2. [TinyMCE] Edition HTML
    Par shaihulud1979 dans le forum Bibliothèques & Frameworks
    Réponses: 5
    Dernier message: 03/01/2012, 07h53
  3. Edition JTextField dans ma JTable
    Par grnez dans le forum Composants
    Réponses: 8
    Dernier message: 22/04/2011, 09h51
  4. Menu fichier,edition (etc) dans du batch
    Par AZzjeioafh dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 22/09/2009, 20h35
  5. Editer/Ecrire dans un ListView
    Par yag00 dans le forum MFC
    Réponses: 3
    Dernier message: 02/03/2008, 20h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo