J'écris une application de liste ToDo pour m'aider à démarrer avec Python. L'application fonctionne sur GAE et je stocke des éléments à faire dans le magasin de données. Je veux leur montrer les objets de tout le monde, et eux seuls. Le problème est que l'application affiche actuellement tous les éléments à tous les utilisateurs, afin que je puisse voir ce que vous écrivez et que vous voyez ce que j'écris. Je pensais que convertir mon objet todo.author en une chaîne et voir s'il correspond au nom de l'utilisateur serait un bon début, mais je ne peux pas comprendre comment faire cela.
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 ceci à l'origine:
<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 j'aimerais afficher les éléments uniquement à 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'était 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)
Le fait de changer mon auteur en StringProperty aura-t-il un effet négatif? Peut-être que je peux renoncer complètement au casting.
TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'
des idées?'str(todo.author)'
comme ça. Je ne suis pas expérimenté avec les modèles Django, mais il semble que son mécanisme d'analyse se bloque à la parenthèse après lestr
nom de la fonction. Ou vous pouvez plutôt obtenir la propriété string de l'auteur, éventuellement quelque chose commetodo.author.nickname
, sans avoir besoin de l'str()
appel.En Python, nous pouvons utiliser la
__str__()
méthode.Nous pouvons le remplacer dans notre classe comme ceci:
class User: firstName = '' lastName = '' ... def __str__(self): return self.firstName + " " + self.lastName
et en courant
il appellera la fonction
__str__(self)
et affichera le firstName et le lastNamela source
str()
est l'équivalent.Cependant, vous devriez filtrer votre requête. Pour le moment, votre requête est celle de
all()
Todo.todos = Todo.all().filter('author = ', users.get_current_user().nickname())
ou
todos = Todo.all().filter('author = ', users.get_current_user())
selon ce que vous définissez l'auteur comme dans le modèle Todo. A
StringProperty
ouUserProperty
.La note
nickname
est une méthode. Vous transmettez la méthode et non le résultat en valeurs de modèle.la source
Vous devez définir la
__unicode__
méthode sur votre modèle et le modèle l'appellera automatiquement lorsque vous référencerez l'instance.la source
Dans la fonction post ():
Donc, pour obtenir str (todo.author), vous avez besoin de str (users.get_current_user ()). Que renvoie 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à.
la source