web-dev-qa-db-fra.com

Python a-t-il un équivalent toString (), et puis-je convertir un élément db.Model en String?

J'écris une application de liste de tâches pour m'aider à démarrer avec Python. L'application fonctionne sur GAE et je stocke des tâches à faire dans le magasin de données. Je veux leur montrer les articles de tout le monde, et eux seuls. Le problème est que l'application affiche actuellement tous les éléments à tous les utilisateurs, donc je peux voir ce que vous écrivez et vous voyez ce que j'écris. Je pensais que couler mon objet todo.author dans une chaîne et voir s'il correspond au nom de l'utilisateur serait un bon début, mais je n'arrive pas à comprendre comment le faire.

C'est ce que j'ai dans mon main.py

... 
user = users.get_current_user()

if user:
    nickname = user.nickname()
    todos = Todo.all()
    template_values = {'nickname':nickname, 'todos':todos}
...

def post(self):

    todo = Todo()
    todo.author = users.get_current_user()
    todo.item = self.request.get("item")
    todo.completed = False

    todo.put()      
    self.redirect('/')

Dans mon index.html, j'avais à l'origine ceci:

<input type="text" name="item" class="form-prop" placeholder="What needs to be done?" required/>
...
 <ul>
{% for todo in todos %}
  <input type="checkbox"> {{todo.item}} <hr />
{% endfor %}
</ul>

mais je souhaite afficher les éléments uniquement pour l'utilisateur qui les a créés. J'ai pensé essayer

{% for todo in todos %}
    {% ifequal todo.author nickname %}
  <input type="checkbox"> {{todo.item}} <hr />
    {% endifequal %}
{% endfor %}

en vain. La liste est vide. J'ai supposé que c'est parce que todo.author n'est pas une chaîne. Puis-je lire la valeur sous forme de chaîne, ou puis-je convertir l'objet en chaîne?

Merci!

Edit: Voici ma classe Todo

class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)

Est-ce que changer mon auteur en StringProperty aura un effet négatif? Je peux peut-être renoncer complètement au casting.

31
Amru E.

En python, la méthode str() est similaire à la méthode toString() dans d'autres langues. Cela s'appelle passer l'objet à convertir en chaîne en tant que paramètre. En interne, il appelle la méthode __str__() de l'objet paramètre pour obtenir sa représentation sous forme de chaîne.

Dans ce cas, cependant, vous comparez un auteur UserProperty de la base de données, qui est de type users.User avec la chaîne de pseudonyme. Vous voudrez comparer la propriété nickname de l'auteur à la place avec todo.author.nickname dans votre modèle.

50
Jeff Lockhart

str() est l'équivalent.

Cependant, vous devez filtrer votre requête. Pour l'instant, votre requête est all() Todo.

todos = Todo.all().filter('author = ', users.get_current_user().nickname()) 

ou

todos = Todo.all().filter('author = ', users.get_current_user())

en fonction de ce que vous définissez auteur comme dans le modèle Todo. Un StringProperty ou UserProperty.

Remarque nickname est une méthode. Vous passez la méthode et non le résultat dans des valeurs de modèle.

3
Tim Hoffman

En fonction post ():

todo.author = users.get_current_user()

Donc, pour obtenir str (todo.author), vous avez besoin de str (users.get_current_user ()). Qu'est-ce qui est retourné par la fonction get_current_user ()?

S'il s'agit d'un objet, vérifiez s'il contient une fonction str () "?

Je pense que l'erreur est là.

2
sinhayash

Vous devez définir le __unicode__ sur votre modèle, et le modèle l'appellera automatiquement lorsque vous référencerez l'instance.

2
Daniel Roseman

dans Python nous pouvons utiliser le méthon __str __ ().

Nous pouvons le surcharger dans notre classe comme ceci:

    class User : 

    firstName=''
    lastName=''
    ...

    def __str__(self):
        return self.firstName +" "+self.lastName

et quand faire

print(user)

il imprimera ensuite firstName et lastName

0
Amirouche Zeggagh