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.
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.
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.
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à.
Vous devez définir le __unicode__
sur votre modèle, et le modèle l'appellera automatiquement lorsque vous référencerez l'instance.
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