116

我正在编写一个 ToDo 列表应用程序来帮助自己开始使用 Python。该应用程序在 GAE 上运行,我将待办事项存储在 Data Store 中。我想向他们展示每个人的物品,而且只有他们一个人。问题是应用程序当前向所有用户显示所有项目,所以我可以看到你写的东西,你看到我写的东西。我认为将我的 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 不是字符串。我可以将值作为字符串读出,还是可以将对象转换为字符串?

谢谢!

编辑:这是我的 Todo 课程

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

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

4

5 回答 5

124

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

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

于 2013-05-27T07:41:07.393 回答
57

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

我们可以像这样在我们的类中覆盖它:

class User: 
    def __init__(self):
        self.firstName = ''
        self.lastName = ''
        ...
        
    def __str__(self):
        return self.firstName + " " + self.lastName

并且在运行时

print(user)

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

于 2019-08-14T13:54:50.227 回答
6

str()是等价的。

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

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

或者

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

取决于您在 Todo 模型中定义的作者。一个StringPropertyUserProperty

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

于 2013-05-27T07:37:59.033 回答
2

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

于 2013-05-27T08:33:39.843 回答
2

在函数 post() 中:

todo.author = users.get_current_user()

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

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

我认为错误就在那里。

于 2013-05-27T08:46:18.820 回答