Partage
  • Partager sur Facebook
  • Partager sur Twitter

Boucle for erreur

Boucle for erreur

Sujet résolu
    13 août 2019 à 19:30:03

    Bonsoir,

    Je demande de l'aide pour une erreur que je reçoit :

    TypeError at /dashboard/

    'Lecture' object is not iterable

    Cette erreur survient dès que j'ajoute cette partie de script:

    for lectures in lectures:
        slugobtenu = Chapitre.objects.get(ordre=lectures.progression, cours=lectures.cours.pk)


    Dans mon fichier views.py dont voici un extrait :

    @login_required
    def dashboard(request):
        lectures = Lecture.objects.filter(utilisateur=request.user.id).order_by('-date_de_mise_à_jour')[1:5]
        dernièrelecture = Lecture.objects.filter(utilisateur=request.user).latest('date_de_mise_à_jour')
        if len(lectures) > 1:
            for lectures in lectures:
                slugobtenu = Chapitre.objects.get(ordre=lectures.progression, cours=lectures.cours.pk)
        slugobtenudernièrelecture = Chapitre.objects.get(ordre=dernièrelecture.progression, cours=dernièrelecture.cours.pk)
        return render(request, 'users/dashboard.html', {'title': 'Panneau de bord', 'navstyle': 'grey', 'navcategories': navcategories, 'navcourses': navcourses, 'lectures':lectures, 'dernièrelecture':dernièrelecture, 'actualité': blog, 'dernierscours':dernierscours, 'dernièresquestions': dernièresquestions, 'slugobtenudernièrelecture':slugobtenudernièrelecture})

    Voilà ;)

    Je précise que sans le bout de script je n'ai aucune erreur. Voici encore mon dashboard.html qui affiche mes lectures :

    <div class="row">
                        {% if lectures %}
                        {% for lecture in lectures %}
                        <div class="col-md-6 col-lg-6 d-flex aos-init aos-animate" data-aos="zoom-out" data-aos-delay="200">
                            <div class="card card-body">
                                <div class="mb-3 mb-lg-5 flex-grow-1">
                                    <span class="h4 mb-0">{{lecture.cours.titre}}</span>
                                </div>
                                <p>
                                    {{lecture.cours.résumé}}
                                </p>
                                <a href="{% url 'courses-get' cours=lecture.cours.pk slug=slugobtenu.slug %}" class="hover-arrow">Poursuivre</a>
                            </div>
                        </div>
                        {% empty %}
                        <div class="col-md-12 col-lg-12 d-flex">
                            Vous n'avez aucune lecture enregistrée pour votre compte. Voici quelques cours qui pourraient vous intéresser.
                        </div>
                        {% endfor %}
                        {% endif %}
                    </div>  


    Merci beaucoup ;)

    • Partager sur Facebook
    • Partager sur Twitter

    Je suis là ;)

      13 août 2019 à 20:40:31

      Il n'est pas interdit d'écrire:

      A = 1, 2, 3
      for A in A:
          print(A)
      print ('***', A)

      mais à la sortie de la boucle A sera la dernière valeur de A et non la séquence initiale.

      • Partager sur Facebook
      • Partager sur Twitter
        13 août 2019 à 21:28:28

        Exact et c'est sans doute l'origine du problème. 

        Par contre on peut écrire sans perte :

        A=1,2,3
        [print(A) for A in A]
        print(A)



        • Partager sur Facebook
        • Partager sur Twitter
          13 août 2019 à 22:12:17

          C'est clairement une source d'emmerdements, et il faudrait être remarquablement pervers et/ou stupide pour le faire exprès.

          Accusons donc la faute de frappe, et remettons un indice de boucle au singulier, comme dans le dashboard.html

           {% for lecture in lectures %}

          et donc

          for lecture in lectures:
             ...
          




          -
          Edité par michelbillaud 13 août 2019 à 22:13:29

          • Partager sur Facebook
          • Partager sur Twitter
            13 août 2019 à 23:09:21

            Merci beaucoup @michelbillaud, ma faute est vraiment stupide, désolé de vous avoir fait perdre du temps à tous les trois. Cependant, j’essaierai de corriger demain je marque comme résolu si c’est le cas sinon je poserai mes questions 😇.
            • Partager sur Facebook
            • Partager sur Twitter

            Je suis là ;)

              14 août 2019 à 8:10:38

              En programmant, on fait des erreurs, c'est tout à fait normal. C'est même très intéressant, ca montre comment on fonctionne.

              Ce qui est stupide c'est de ne pas les corriger, et de ne pas en retenir quelque chose. Comme on les refera certainement, autant prendre le temps de voir comment ça se produit.

              Dans tous les cas,  for x in x est une mauvaise idée,  meme quand ca marche, parce que le même nom désigne deux choses differentes, ce qui ne fait qu'embrouiller le prochain qui devra relire le code (en plus de celui qui l'ecrit).

              Par contre,  for truc in trucs, c'est plutôt bien, et la faute de frappe éventuelle  est facile à voir.

              -
              Edité par michelbillaud 14 août 2019 à 8:34:55

              • Partager sur Facebook
              • Partager sur Twitter
                14 août 2019 à 12:02:32

                Et bien j'ai appris de cette erreur, et même je l'ai corrigée dans plusieurs pages de mon site...génial tout fonctionne. Merci de ton aide ;) !

                J'avais volontairement enlevé le s à lectures pour que l'on sache de quoi l'on parle, mais apparemment je ne l'avais pas fait dans mes views. Sujet résolu !

                • Partager sur Facebook
                • Partager sur Twitter

                Je suis là ;)

                Boucle for erreur

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown