Ik ben een takenlijst-app aan het schrijven om mezelf te helpen aan de slag te gaan met Python. De app draait op GAE en ik sla todo-items op in de Data Store. Ik wil de items van iedereen aan hen laten zien, en aan hen alleen. Het probleem is dat de app momenteel alle items aan alle gebruikers toont, dus ik kan zien wat je schrijft en jij ziet wat ik schrijf. Ik dacht dat het een goed begin zou zijn om mijn todo.author-object naar een string te casten en te kijken of het overeenkomt met de naam van de gebruiker, maar ik weet niet hoe ik dat moet doen.
Dit is wat ik heb in mijn 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 mijn index.html had ik dit oorspronkelijk:
<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>
maar ik wil items alleen laten zien aan de gebruiker die ze heeft gemaakt. Ik dacht eraan om het te proberen
{% for todo in todos %}
{% ifequal todo.author nickname %}
<input type="checkbox"> {{todo.item}} <hr />
{% endifequal %}
{% endfor %}
het mocht niet baten. De lijst wordt leeg weergegeven. Ik nam aan dat dit komt omdat todo.author geen string is. Kan ik de waarde uitlezen als een string, of kan ik het object casten naar String?
Bedankt!
Bewerken: hier is mijn Todo-les
class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)
Heeft het veranderen van mijn auteur naar een StringProperty iets negatiefs? Misschien kan ik helemaal afzien van casten.
Antwoord 1, autoriteit 100%
In python, de str()
methode lijkt op de toString()
methode in andere talen. Het wordt het doorgeven van het object genoemd om als parameter naar een string te converteren. Intern roept het de methode __str__()
van het parameterobject aan om zijn tekenreeksrepresentatie te krijgen.
In dit geval vergelijkt u echter een UserProperty
-auteur uit de database, van het type users.User
met de bijnaamreeks. Je zult in plaats daarvan de eigenschap nickname
van de auteur willen vergelijken met todo.author.nickname
in je sjabloon.
Antwoord 2, autoriteit 39%
In Python kunnen we de __str__()
methode gebruiken.
We kunnen het in onze klas als volgt overschrijven:
class User:
firstName = ''
lastName = ''
...
def __str__(self):
return self.firstName + " " + self.lastName
en tijdens het hardlopen
print(user)
het zal de functie __str__(self)
aanroepen en de voornaam en achternaam afdrukken
Antwoord 3, autoriteit 4%
str()
is het equivalent.
U moet uw zoekopdracht echter filteren. Op dit moment is uw vraag all()
Todo’s.
todos = Todo.all().filter('author = ', users.get_current_user().nickname())
of
todos = Todo.all().filter('author = ', users.get_current_user())
afhankelijk van wat u auteur definieert zoals in het Todo-model. Een StringProperty
of UserProperty
.
Opmerking nickname
is een methode. U geeft de methode door en niet het resultaat in sjabloonwaarden.
Antwoord 4, autoriteit 2%
U moet de methode __unicode__
op uw model definiëren, en de sjabloon roept deze automatisch aan wanneer u naar de instantie verwijst.
Antwoord 5, autoriteit 2%
In functie post():
todo.author = users.get_current_user()
Dus om str(todo.author) te krijgen, heb je str(users.get_current_user()) nodig. Wat wordt geretourneerd door de functie get_current_user() ?
Als het een object is, controleer dan of het een functie str()” bevat?
Ik denk dat daar de fout zit.