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 :

Django: Boucle for et afficage des resulats dans un template


Sujet :

Django Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Points : 36
    Points
    36
    Par défaut Django: Boucle for et afficage des resulats dans un template
    Bonjour,

    Je cherche a afficher le nom de personne en fonction de leur ID. J'utilise la table User de Django pour m'authentifier.
    La boucle for fonctionne bien, dans le terminal j'ai bien les résultats des ID sous cette forme:

    p.id
    1
    p.id
    2

    qui s'affiche mais dans le template, je n'en ai qu'un seul résultat, le premier, alors que j'aimerai en plusieurs

    Savez-vous pourquoi ?

    Merci

    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
    class Mission(models.Model):
        nom = models.ManyToManyField(Identite, blank=True, null=True)
        dsx = models.CharField(max_length=7, blank=True, default='', null=True)
        pays = models.ForeignKey(Pays)
        ville = models.CharField(max_length=15, null=True)
        date_depart = models.DateField(blank=True, null=True)
        date_retour = models.DateField(blank=True, null=True)
        vol = models.TextField(blank=True, default='', null=True)
        etat = models.BooleanField(default=False)
        document = models.ManyToManyField(Typedoc, null=True)
        fichenavette = models.TextField(null=True)
        source = models.CharField(max_length=20, blank=True, default='', null=True)
     
    class Assurance(models.Model):
        nom = models.ForeignKey(User, null=True)
        type_assurance = models.CharField(max_length=20)
        num_contrat = models.CharField(max_length=10)
        nom_assurance = models.CharField(max_length=10)
        validite = models.DateField(blank=True, null=True)
        acquereur = models.CharField(max_length=20, blank=True, null=True)
        repondant = models.CharField(max_length=20, blank=True, null=True)
    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
    #idm = id de la mission
     
    def detail_mission(request,idm):
        identite = Identite.objects.all()
     
        missionss = Mission.objects.filter(id=idm)
     
        missions = Mission.objects.filter(id=idm)
        print missions.query
        for mission in missions:
            for p in mission.nom.all():
                print "p.id"
                print p.id
     
                assurance = Assurance.objects.all().filter(nom_id=p.id)
            return render(request, 'detail_mission.html', {'identites': identite, 'missions':missionss, 'assurances':assurance})
    templates
    ------------
    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
     
                {% if assurances %}
    <table>
                  <thead>
                            <tr>
                                            <th>nom:</th>
                                            <th>Nom de l'assurance:</th>
     
                            </tr>
                  </thead>
                  <tbody>
                            <tr>{% for assurance in assurances %}
     
                                <td>{{ assurance.nom }}</td>
                                <td>{{ assurance.nom_assurance }}</td>
     
                            </tr>{% endfor %}
                  </tbody>
    </table>{% endif %}
    Merci à vous

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut,

    As-tu regardé le code source html généré ?

    Car à mon avis, cela vient du fait que le for dans ton template se situe après le <tr>, alors qu'il devrait se situer avant, je pense, ce n'est qu'une supposition, que tout est bien généré, mais comme tout se situe sur la même ligne de ton tableau, les autres cellules doivent se retrouver hors visibilité dans ta page html.

    A voir si cela provient de ça.
    Le temps ronge l'amour comme l'acide.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    J’ai regardé le code source mais rien de bizarre. Du coup j’ai testé en supprimant le tableau html et en ne laissant que les balise python.

    Résultat: même chose. Je n’ai qu’une seule ligne au lieu des 2 que je devrait avoir pour mon exemple.

    C’est pourtant pas sorcier !! Je crois ...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    M’a conseillé de créer une liste entre les deux boucles for dans ma vue

    Et ensuite de mettre un .append dans le reste du code mais je ne sais pas trop où

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 231
    Points : 203
    Points
    203
    Par défaut
    Bonjour,

    As-tu vu ce que tu envois à assurances ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assurance = Assurance.objects.all().filter(nom_id=p.id)
    Rien ne te choque ? ;-)

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    En effet, mais j'ai testé avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assurance = Assurance.objects.filter(nom_id=p.id)
    mais cela ne fonctione pas

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Bonjour Nico,

    Je ne suis pas un expert et je ne fais que proposer une solution.

    assurance = Assurance.objects.filter(nom_id=p.id)
    Tu filtres ici sur le champ nom_id, cependant tu ne l'as pas définis dans ton model il me semble, tu devras filtrer sur le champ id (créé automatiquement) ou le champ nom que tu as ajouté à ton model.

    Cordialement Quentin.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    "nom_id" correspond à la clé du manytomany.

    cependant, j'ai testé avec "nom" et "id" , mais j'ai toujours le meme probleme, je n'obtient qu'un nom en sortie de boucle dans mon template

    cdt

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Cela ne résoudra pas ton soucis mais j'effectuerais l'action de cette manière.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    def detail_mission(request,idm):
        identite = Identite.objects.all()
     
        mission = Mission.objects.filter(id=idm).values_list('id', flat=True)
        assurances = Assurance.objects.filter(nom=mission[0])
        return render(request, 'detail_mission.html', {'identites': identite, 'missions':mission, 'assurances':assurance})
    Je te propose cette solution n'ayant surement pas compris l'intérêt de ta première boucle for.
    Ton problème est d'ailleurs peut être la tu réalises ton return dans la première boucle de ton for...

Discussions similaires

  1. [MySQL] affichage des resulats dans un tableau
    Par beaf05 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/01/2011, 12h32
  2. boucle for each sur des fichiers
    Par Nako_lito dans le forum VBA Access
    Réponses: 2
    Dernier message: 02/08/2010, 14h21
  3. faire une boucle for..next sur des textbox
    Par Actarusdu60 dans le forum VB.NET
    Réponses: 1
    Dernier message: 28/11/2008, 21h51
  4. Réponses: 14
    Dernier message: 03/06/2008, 09h59
  5. Réponses: 2
    Dernier message: 29/08/2006, 13h59

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