Heeft Python een toString()-equivalent en kan ik een db.Model-element converteren naar String?

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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

5 + six =

Other episodes