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

Réseau/Web Python Discussion :

Erreur avec une string lors que l'on extrait des info d une base de donnée


Sujet :

Réseau/Web Python

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut Erreur avec une string lors que l'on extrait des info d une base de donnée
    Bonjour,
    Un collègue m'a donné un bon de code que j'utilise depuis un moment.
    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
    sql = context.select_publications_all_by_user
    result = sql(owner=int(publication_user))
    out_tmpl = """<tr><td style="border-bottom:1px dashed #cccccc;"><img style="margin-top:8px;" src="../../img/arrow-small-right.gif" /></td><td style="border-bottom:1px dashed #cccccc; padding:5px 0px 5px 0px;"><span><b>%s</b></span>, <span>%s</span>, <span>%s</span>, <span>%s</span></td></tr>
    """
    
    dicts = result.dictionaries()
    
    if not len(dicts):
      return "The selected collaborator has no entries corresponding at the desired category"
    
    out = []
    for item in result.dictionaries():
      out.append(out_tmpl %(item['team'], item['years'], item['title'],item['ref']))
    
    return """<table class="tb_publications" cellpadding="3" cellspacing="0">%s</table>""" %"\n".join(out)
    
    #
    Le problème dans ce code, c'est que si le champs team, years ou title, de ma base de donnée sont vide, il affichera la virgule, qui sont soulignée, dans le code ci-dessu.

    Alors je dois trouver une solution pour la virgule qui précede un des item[''] ne s'affiche pas si se derniere champs est vide dans la base de donné.

    On m'a donc proposé ce code, mais je me casse la tete a le faire fonctionner ca je sais qu'il y a un binz au niveau de (out_tmpl %(x,y,z,", ".join(cells)))

    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
    sql = context.select_publications_all_by_user
    result = sql(owner=int(publication_user))
    
    out_tmpl = """<tr><td style="border-bottom:1px dashed #cccccc;"><img style="margin-top:8px;" src="../../img/arrow-small-right.gif" /></td>
                       <td style="border-bottom:1px dashed #cccccc; padding:5px 0px 5px 0px;"><span><b>%s</b></span> %s %s %s</td>
                 </tr>"""
    field_names = ['fd_team','fd_years', 'fd_title', 'fd_ref',] # and other field names, just an example
    
    rows = []
    for item in result.dictionaries():
        cells = []
        for field_name in field_names:
            value = item.get(field_name, '')
            if value:
                cells.append("<span>%s</span>" %value)
        rows.append(out_tmpl %(x,y,z,", ".join(cells)))        # just an example, fill in the correct values for x,y and z
                
    return """<table class="tb_publications" cellpadding="3" cellspacing="0">%s</table>""" %"".join(rows)
    A la place de (out_tmpl %(x,y,z,", ".join(cells))) , j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (out_tmpl %(fd_team,fd_years,fd_title,fd_ref,", ".join(cells)))
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (out_tmpl %(%s,%s,%s,%s,", ".join(cells)))
    Mais sans succès :o(
    Arrivez vous voir mes erreur, corriger mon code?
    Avez vous mieux a me proposer

    Milles merci, je suis un super debutant en Python
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    les virgules que tu vois afficher ne sont pas celles que tu crois, c'est le formatage de out_tmpl avec des strings vides qui te donne cette impression:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> out_tmpl = "%s, %s, %s, %s"
    >>> out_tmpl % ('un', 'deux', 'trois', 'quatre')
    'un, deux, trois, quatre'
    >>> out_tmpl % ('un', '', '', 'quatre')
    'un, , , quatre'
    essaie ça:
    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
    sql = context.select_publications_all_by_user
    result = sql(owner=int(publication_user))
     
    out_tmpl = """
    <tr>
     <td style="border-bottom:1px dashed #cccccc;">
      <img style="margin-top:8px;" src="../../img/arrow-small-right.gif" />
     </td>
     <td style="border-bottom:1px dashed #cccccc; padding:5px 0px 5px 0px;">
      %s
     </td>
    </tr>
    """
     
     
    dicts = result.dictionaries()
     
    if not dicts:
      return "The selected collaborator has no entries corresponding at the desired category"
     
    out = []
    fields = ['team', 'years', 'title', 'ref']
    for d in dicts:
      d['team'] = d['team'] and "<b>%s</b>" % d['team' ] or ""
      out.append(out_tmpl % ", ".join([
        "<span>%s</span>" % d[k] for k in fields if d[k]]))    
     
     
    return """<table class="tb_publications" cellpadding="3" cellspacing="0">%s</table>""" %"\n".join(out)
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Salut,
    merci pour ta réponse qui est super intéressante. j'ai remplacé le code, ca donne un super bon resultat.

    Avant, j'aimerais juste ajouté un truc. Dans mon poste j'ai souligné les virgules. Mais en fait c'est pas ces virgules que je voulais souligner, mais celles qui se trouvent netre les <span>ici</span>
    Desoélé pour on manque de précision.

    Cependant, j'aimerais comprendre un truc sur ta réponse (sorry, mais je connais que très peu Python)


    Je ne comprend pas trop cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d['team'] = d['team'] and "<b>%s</b>" % d['team' ] or ""
    En fait elle sert pour formater le texte?
    je l'ai mise en commentaire et le texte s'affiche comme même. En meme temps, j'ai vider le champs years, et la virgule apres l'anné ne s'affiche plus. Donc c'est excellent. Mais pourquoi le champs years agit ainsi puisqu'il y a que cette ligne
    d['team'] = d['team'] and "<b>%s</b>" % d['team' ] or ""

    De plus j'ai encore un peu de mal (meme si je crois le deviner) a quel moment il est dit d'afficher la virgule ou pas.
    Pourrais-je te demander de corriger mes commentaire dans le code ci-dessous:
    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
     
    sql = context.select_publications_all_by_user
    result = sql(owner=int(publication_user))
     
    out_tmpl = """
    <tr>
     <td style="border-bottom:1px dashed #cccccc;">
      <img style="margin-top:8px;" src="../../img/arrow-small-right.gif" />
     </td>
     <td style="border-bottom:1px dashed #cccccc; padding:5px 0px 5px 0px;">
      %s
     </td>
    </tr>
    """
     
     
    dicts = result.dictionaries()
     
    if not dicts:
      return "The selected collaborator has no entries corresponding at the desired category"
     
    out = []
    #"Collect" les champs désiré de la DB dan sun tableau
    fields = ['team', 'years', 'title', 'ref'] 
    for d in dicts:
       #Pour la valeur du champs team, mets le texte en gras
      d['team'] = d['team'] and "<b>%s</b>" % d['team' ] or ""
     
    # concatenate à out_tmpl, les valeur du tableau field, plus une virgule.  
    out.append(out_tmpl % ", ".join(["<span>%s</span>" % d[k] for k in fields if d[k]]))    
     
    #Retourne la valeur complete de out_tmpl
    return """<table class="tb_publications" cellpadding="3" cellspacing="0">%s</table>""" %"\n".join(out)
    Dans tous les cas, milles mercis pour ton aide, super "fructueuse"
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  4. #4
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Je suis parti de l'idée que chaque donnée de ta base était formatée de la même manière sauf le champ team qui est affiché en gras, donc je fais cette modification en premier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d['team'] = d['team'] and "<b>%s</b>" % d['team' ] or ""
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if d['team']:
        d['team'] = "<b>%s</b>" % d['team']
    .
    Ensuite je créé la chaîne qui sera inséré dans out_tmpl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ", ".join(["<span>%s</span>" % d[k] for k in fields if d[k]])
    equivaut à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    temp=[]
    for field in fields:
        if d[field]:
             temp.append("<span>%s</span>" % d[field])
    " ,".join(temp)
    les champs vides ne sont donc pas transformés en <span></span> d'où l'absence de virgule entre les champs vides.

    voilà, voilà...
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Merci beaucoup pour ces explications. Elles m'ont été d'une enorme utilité
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur avec IntelliJ Idea lors de l'affichage de mon application
    Par Rapidego dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 30/10/2014, 22h03
  2. Est-ce que Python, peux collecter des infos sur une machine
    Par pierrot10 dans le forum Général Python
    Réponses: 2
    Dernier message: 26/04/2012, 22h56
  3. Réponses: 3
    Dernier message: 13/08/2010, 07h10
  4. [des panneaux dans une page web] que choisir ?
    Par oursblanc dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 02/12/2005, 11h02
  5. simuler des onclick d'une fiche autre que la présente
    Par bertrand_declerck dans le forum Langage
    Réponses: 3
    Dernier message: 30/08/2005, 10h04

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