Ich schreibe eine ToDo-Listen-App, um mir den Einstieg in Python zu erleichtern. Die App läuft auf GAE und ich speichere Aufgaben im Datenspeicher. Ich möchte ihnen alle Gegenstände zeigen, und sie allein. Das Problem ist, dass die App derzeit allen Benutzern alle Elemente anzeigt, sodass ich sehen kann, was Sie schreiben, und Sie sehen, was ich schreibe. Ich dachte, mein todo.author-Objekt in eine Zeichenfolge umzuwandeln und zu prüfen, ob es mit dem Namen des Benutzers übereinstimmt, wäre ein guter Anfang, aber ich kann nicht herausfinden, wie das geht.
Das habe ich in meiner 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('/')
In meiner index.html hatte ich dies ursprünglich:
<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>
Ich möchte Elemente jedoch nur dem Benutzer anzeigen, der sie erstellt hat. Ich dachte daran, es zu versuchen
{% for todo in todos %}
{% ifequal todo.author nickname %}
<input type="checkbox"> {{todo.item}} <hr />
{% endifequal %}
{% endfor %}
umsonst. Die Liste wird leer angezeigt. Ich nahm an, dass es daran liegt, dass todo.author keine Zeichenfolge ist. Kann ich den Wert als Zeichenfolge auslesen oder das Objekt in Zeichenfolge umwandeln?
Vielen Dank!
Edit: Hier ist meine Todo-Klasse
class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)
Wird sich das Ändern meines Autors in eine StringProperty negativ auswirken? Vielleicht kann ich ganz auf das Casting verzichten.
TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'
Ideen?'str(todo.author)'
. Ich habe keine Erfahrung mit Django-Vorlagen, aber es scheint, dass der Analysemechanismus in Klammern nach demstr
Funktionsnamen hängen bleibt . Oder Sie erhalten lieber die Zeichenfolgeeigenschaft des Autors, möglicherweise so etwastodo.author.nickname
, ohne dass derstr()
Aufruf erforderlich ist .In Python können wir die
__str__()
Methode verwenden.Wir können es in unserer Klasse folgendermaßen überschreiben:
class User: firstName = '' lastName = '' ... def __str__(self): return self.firstName + " " + self.lastName
und beim Laufen
Es ruft die Funktion auf
__str__(self)
und gibt den Vor- und Nachnamen ausquelle
str()
ist das Äquivalent.Sie sollten jedoch Ihre Abfrage filtern. Im Moment ist Ihre Anfrage
all()
Todo's.todos = Todo.all().filter('author = ', users.get_current_user().nickname())
oder
todos = Todo.all().filter('author = ', users.get_current_user())
abhängig davon, was Sie als Autor im Todo-Modell definieren. A
StringProperty
oderUserProperty
.Hinweis
nickname
ist eine Methode. Sie übergeben die Methode und nicht das Ergebnis in Vorlagenwerten.quelle
Sie sollten die
__unicode__
Methode in Ihrem Modell definieren, und die Vorlage ruft sie automatisch auf, wenn Sie auf die Instanz verweisen.quelle
In der Funktion post ():
Um str (todo.author) zu erhalten, benötigen Sie str (users.get_current_user ()). Was wird von der Funktion get_current_user () zurückgegeben?
Wenn es sich um ein Objekt handelt, prüfen Sie, ob es eine str () "- Funktion enthält.
Ich denke, der Fehler liegt dort.
quelle