it-swarm.com.de

Hat Python ein toString () - Äquivalent und kann ich ein db.Model-Element in einen String konvertieren?

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 nur sie. 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 sehen, 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 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 bleibt leer. Ich nahm an, es liegt daran, dass todo.author keine Zeichenfolge ist. Kann ich den Wert als String auslesen oder das Objekt in String umwandeln?

Vielen Dank!

Bearbeiten: 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)

Wirkt sich eine Änderung meines Autors in ein StringProperty-Objekt negativ aus? Vielleicht kann ich ganz auf das Casting verzichten.

31
Amru E.

In Python ist die str() -Methode der toString() -Methode in anderen Sprachen ähnlich. Es wird aufgerufen, das zu konvertierende Objekt als Parameter in einen String zu übergeben. Intern ruft es die __str__() -Methode des Parameterobjekts auf, um dessen Zeichenfolgendarstellung abzurufen.

In diesem Fall vergleichen Sie jedoch einen UserProperty -Autor aus der Datenbank, der vom Typ users.User ist, mit der Kurznamenzeichenfolge. Sie möchten die Eigenschaft nickname des Autors stattdessen mit todo.author.nickname In Ihrer Vorlage vergleichen.

50
Jeff Lockhart

str() ist das Äquivalent.

Sie sollten jedoch Ihre Abfrage filtern. Im Moment lautet 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())

dies hängt davon ab, was Sie als Autor im Todo-Modell definieren. A StringProperty oder UserProperty.

Hinweis nickname ist eine Methode. Sie übergeben die Methode und nicht das Ergebnis in Vorlagenwerten.

3
Tim Hoffman

In der Funktion post ():

todo.author = users.get_current_user()

Um str (todo.author) zu erhalten, benötigen Sie str (users.get_current_user ()). Was gibt die Funktion get_current_user () zurück?

Wenn es sich um ein Objekt handelt, prüfen Sie, ob es eine str () "- Funktion enthält.

Ich denke der Fehler liegt da.

2
sinhayash

Sie sollten die Methode __unicode__ Für Ihr Modell definieren. Die Vorlage ruft sie automatisch auf, wenn Sie auf die Instanz verweisen.

2
Daniel Roseman

in Python können wir __str __ () Methon verwenden.

Wir können es in unserer Klasse so überladen:

    class User : 

    firstName=''
    lastName=''
    ...

    def __str__(self):
        return self.firstName +" "+self.lastName

und wann machen

print(user)

es wird dann Vorname und Nachname gedruckt

0