Python是否具有toString()等价物,我可以将db.Model元素转换为String吗?

Amr*_* E. 45 python google-app-engine django-templates

我正在编写一个ToDo列表应用程序,以帮助自己开始使用Python.该应用程序在GAE上运行,我将待办事项存储在数据存储中.我想向他们展示每个人的项目,而且他们一个人.问题是该应用程序当前向所有用户显示所有项目,因此我可以看到您所写的内容,并且您可以看到我写的内容.我想把我的todo.author对象转换成一个字符串,看看它是否与用户名相匹配将是一个好的开始,但我无法弄清楚如何做到这一点.

这就是我在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('/')
Run Code Online (Sandbox Code Playgroud)

在我的index.html中我最初有这个:

<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>
Run Code Online (Sandbox Code Playgroud)

但我想只向创建它们的用户显示项目.我想过尝试

{% for todo in todos %}
    {% ifequal todo.author nickname %}
  <input type="checkbox"> {{todo.item}} <hr />
    {% endifequal %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

无济于事.该列表显示为空白.我以为是因为todo.author不是字符串.我可以将值读出为字符串,还是可以将对象转换为String?

谢谢!

编辑:这是我的Todo课程

class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

将我的作者改为StringProperty会产生什么负面影响吗?也许我可以完全放弃施法.

Jef*_*art 59

在python中,该str()方法类似于toString()其他语言中的方法.它被称为传递对象以转换为字符串作为参数.在内部,它调用__str__()参数对象的方法来获取其字符串表示.

但是,在这种情况下,您要比较UserProperty数据库中的作者,该作者的类型users.User与昵称字符串相对应.您需要在模板中比较nickname作者的属性todo.author.nickname.


Ami*_*agh 6

在Python中,我们可以使用__str __()methon。

我们可以这样在类中重载它:

    class User : 

    firstName=''
    lastName=''
    ...

    def __str__(self):
        return self.firstName +" "+self.lastName
Run Code Online (Sandbox Code Playgroud)

而当

print(user)
Run Code Online (Sandbox Code Playgroud)

它将调用函数__str __(self) 并打印firstName和lastName


Tim*_*man 5

str() 是等价的。

但是,您应该过滤您的查询。目前您的查询是all()Todo 的。

todos = Todo.all().filter('author = ', users.get_current_user().nickname()) 
Run Code Online (Sandbox Code Playgroud)

或者

todos = Todo.all().filter('author = ', users.get_current_user())
Run Code Online (Sandbox Code Playgroud)

取决于您在 Todo 模型中定义的作者。AStringPropertyUserProperty

注意nickname是一种方法。您正在传递方法而不是模板值中的结果。