2017-04-03 1 views
-1

J'ai un petit problème, qui est, je veux convertir le nombre de clients aime à un pourcentage dans le panneau d'administration, le nombre maximum de float est jusqu'à 5.0 donc il a obtenu le 5 étoiles et baisse dire 0.0 a été fondée.Comment convertir les likes nombre en pourcent, Flask?

Voici mon model.py:

appointment_upvotes = db.Table('appointment_upvotes', 
    db.Column('appointment_id', db.Integer, db.ForeignKey('appointment.id')), 
    db.Column('rate_appo_id', db.Integer, db.ForeignKey('rate_appo.id')) 
) 

class Appointment(db.Model): 
    id = db.Column(db.Integer(), primary_key=True) 
    start_time = db.Column(db.Integer(), nullable=False) 
    end_time = db.Column(db.Integer(), nullable=False) 
    timezone = db.Column(db.String(TIMEZONE_LEN_MAX), nullable=False) 
    note = db.Column(db.String()) 
    status = db.Column(db.Boolean(), default=False) 

    is_accepted = db.Column(db.Boolean(), default=False) 
    is_not_accepted = db.Column(db.Boolean(), default=True) 

    client_id = db.Column(db.Integer(), db.ForeignKey('client.id')) 
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id')) 
    service_id = db.Column(db.Integer(), db.ForeignKey('service.id')) 

    rates = db.relationship('RateAppo', backref='appointment', lazy='dynamic') 

class RateAppo(db.Model): 
    id = db.Column(db.Integer(), primary_key=True) 
    rate_punctuality = db.Column(db.Integer(), default=0) 
    rate_nonconf = db.Column(db.Integer(), default=0) 
    rate_solvency = db.Column(db.Integer(), default=0) 
    text = db.Column(db.Text(), default=None) 

    appo_id = db.Column(db.Integer(), db.ForeignKey('appointment.id')) 

    def __repr__(self): 
     return "Comment: {}".format(self.text)[0:15] 

    def has_voted(self, appointment_id): 
     select_votes = appointment_upvotes.select(
       db.and_(
        appointment_upvotes.c.appointment_id == appointment_id, 
        appointment_upvotes.c.rate_appo_id == self.id 
       ) 
     ) 
     rs = db.engine.execute(select_votes) 
     return False if rs.rowcount == 0 else True 

    def vote(self, appointment_id, typevote): 
     already_voted = self.has_voted(appointment_id) 
     vote_status = None 
     if not already_voted: 
      if typevote == 'rate_punctuality': 
       db.engine.execute(
       appointment_upvotes.insert(), 
        appointment_id = appointment_id, 
        rate_appo_id = self.id 
       ) 
       self.rate_punctuality = self.rate_punctuality + 1 
       vote_status = True 
      elif typevote == 'rate_nonconf': 
       db.engine.execute(
       appointment_upvotes.insert(), 
        appointment_id = appointment_id, 
        rate_appo_id = self.id 
       ) 
       self.rate_nonconf = self.rate_nonconf + 1 
       vote_status = True 
      else: 
       db.engine.execute(
       appointment_upvotes.insert(), 
        appointment_id = appointment_id, 
        rate_appo_id = self.id 
       ) 
       self.rate_solvency = self.rate_solvency + 1 
       vote_status = True 
     db.session.commit() 
     return vote_status 

A l'intérieur du panneau d'administration, le taux sera ressemble à ceci par exemple:

Note moyenne: 4.5

n » Peu importe le nombre de likes qu'il a, disons qu'il a obtenu 100 likes, je ne veux pas les montrer en nombre, juste besoin d'obtenir la valeur jusqu'aux marques 5.0

Une autre chose que j'ai oublié de mentionner, peut-être dans mon modèle jinja je peux le faire fonctionner ??

Voici un exemple:

Ponctualité: 100 aime en pour cent peut-être sera 4,52

Solvabilité: 63 en pour cent, il sera peut-être 3,23

donc dans Ponctualité il y aura 4 étoiles, et en Solvabilité sera 3 étoiles et ainsi de suite.

La dernière chose est de montrer une statistiques complètes de tous ces gens dans une ligne, par exemple dans mon panneau je vais obtenir quelque chose comme ceci:

click me to see an example

donc dans mes modèles je peux taper quelque chose comme ceci:

<div class="col-sm-8"><h2>Average Rating: <strong> {{ "%.2f" % user.rate_appo.count }} </strong></h2> 
    <div class="table-responsive"> 
    <table class="table table-striped text-center"> 
     <thead> 
     <tr> 
      <th class="text-center">Punctuality</th> 
      <th class="text-center">Non-Conflict</th> 
      <th class="text-center">Solvency</th> 



     </tr> 
     </thead> 
     <tbody> 
     <tr> 
      <td>{{ "%.2f" % user.rate_appo.rate_punctuality.count}} </td> 
      <td>{{ "%.2f" % user.rate_appo.rate_nonconf.count}} </td> 
      <td>{{ "%.2f" % user.rate_appo.rate_solvency.count}} </td> 


     </tr> 



     </tbody> 
    </table> 
</div> 

suis vraiment pas sûr de ce que je tapais ci-dessus, j'ai utilisé le % .2f juste pour simplifier l'examen pour être plus clair pour vous tous.

Finalement, c'est un projet qui fonctionne et s'il vous plaît toutes les suggestions serait tonnes apprécié :).

Répondre

0

Je ne pouvais pas savoir quel est le "nombre de likes" dans vos modèles, mais je pense que votre problème est "la conversion d'un nombre dans un autre format dans le panneau d'administration de flask".

Si oui, cela pourrait aider:

An example de formes personnalisées - flacon-Admin. Il a converti le chemin d'accès au fichier en balise HTML <img> à l'aide d'une vue de modèle personnalisée.

ici est le code clé:

https://github.com/flask-admin/flask-admin/blob/master/examples/forms/app.py#L110

EDIT:

On suppose qu'il existe une fonction de python nommé convertLikes pourrait convertir aime nombre en nombre d'étoiles, comme: convertLikes(100) retournera 4,52 . Ensuite, définissez comme un filtre de jinja2 et remplacer votre code:

<td>{{ "%.2f" % user.rate_appo.rate_punctuality.count}} </td> 

avec:

<td>{{ user.rate_appo.rate_punctuality.count | convertLikes }} </td> 

la syntaxe du filtre invoquera convertLikes(user.rate_appo.rate_punctuality.count) et retourner le nombre d'étoiles dans <td> tag.

Par exemple:

Définition d'une fonction de filtre en python:

def convertLikes(count): 
    # do the convertion 
    return stars_number 

Inscrivez-vous sur l'environnement du modèle:

app = Flask(__name__) 
app.jinja_env.filters['convertLikes'] = convertLikes 

Utilisez dans modèle jinja2:

<td>{{ user.rate_appo.rate_punctuality.count | convertLikes }} </td> 
+0

Tout d'abord, tha nks pour votre intérêt. Je ne veux pas convertir n'importe quel type de données par ce que vous avez offert, je veux juste montrer le nombre de mon client comme je l'ai mentionné ci-dessus pas par des chiffres mais par pourcentage dans mon cas juste jusqu'à – reznov11

+0

question donc ce sera plus clair :). – reznov11

+0

Si vous pouvez modifier le modèle jinja2, ** les filtres personnalisés jinja2 ** peuvent faire l'affaire. http://jinja.pocoo.org/docs/2.9/api/#custom-filters –