Python是否具有等效的toString(),并且可以将db.Model元素转换为String吗?


87

我正在编写一个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('/')

在我的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>

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

{% for todo in todos %}
    {% ifequal todo.author nickname %}
  <input type="checkbox"> {{todo.item}} <hr />
    {% endifequal %}
{% endfor %}

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

谢谢!

编辑:这是我的Todo课

class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)

将我的作者更改为StringProperty会产生负面影响吗?也许我可以完全放弃铸造。

Answers:


92

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

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


谢谢你的回答。尝试在模板中使用str(todo.author)时出现以下错误:有TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'任何想法吗?
Amru E.

1
尝试'str(todo.author)'像这样加引号。我对Django模板没有经验,但是似乎它的解析机制正挂在str函数名后面的括号中。或者,您可能宁愿获得作者的string属性,可能类似于todo.author.nickname,而无需str()调用。
杰夫·洛克哈特

我终于得到它的工作!我在if语句中使用了dodo.author.nickname,并检查该值是否与当前用户的昵称匹配。请修改您的答案以包含该答案,以便我接受。
Amru E.

35

在Python中,我们可以使用__str__()方法。

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

class User: 

    firstName = ''
    lastName = ''
    ...

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

当跑步时

print(user)

它将调用该函数__str__(self) 并打印firstName和lastName


6

str() 是等效的。

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

todos = Todo.all().filter('author = ', users.get_current_user().nickname()) 

要么

todos = Todo.all().filter('author = ', users.get_current_user())

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

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


感谢您的回复!我将继续尝试现在实施过滤器。不过,我对昵称有些困惑。我以前玩过它,我能够像处理其他任何字符串一样操作它,并通过模板值发送它。我想念什么吗?哦,作者是UserProperty。我将其添加到我的原始问题中。
Amru E.

我不使用Django模板,所以我不知道它们会做什么。某些模板系统将自动调用可调用对象(nickname())
蒂姆·霍夫曼

您介意简要说明过滤器的作用吗?我不确定todos = Todo.all()的实际功能是什么。
Amru E.

从示例代码中可以看到,filter是一个查询参数,特别是author属性=一些值。您确实应该花一些时间阅读文档,这将为您节省很多时间。 developers.google.com/appengine/docs/python/datastore讨论了数据存储以及如何获取/放置和查询数据。
蒂姆·霍夫曼

2

您应该__unicode__在模型上定义方法,并且在引用实例时模板将自动调用该方法。


2

在函数post()中:

todo.author = users.get_current_user()

因此,要获取str(todo.author),您需要str(users.get_current_user())。get_current_user()函数返回什么?

如果它是一个对象,请检查它是否包含一个str()“函数?

我认为错误就在那。


users.get_current_user()返回一个用户对象,该对象具有nickname()为用户提供可读的名称。我在正确获取昵称时遇到了麻烦,但是我知道了。谢谢!
Amru E.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.