【问题标题】:Does Python have a toString() equivalent, and can I convert a class to String?Python 是否有一个 toString() 等价物,我可以将一个类转换为字符串吗?
【发布时间】:2013-05-22 00:32:28
【问题描述】:

我正在编写一个 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 不是字符串。我可以将值作为字符串读出,还是可以将对象转换为字符串?

谢谢!

编辑:这是我的 Todo 类

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

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

【问题讨论】:

    标签: python django-templates


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。在模板中尝试 str(todo.author) 时出现以下错误:TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)' 有什么想法吗?
    • 尝试像这样在'str(todo.author)' 周围加上引号。我没有使用 Django 模板的经验,但它的解析机制似乎在 str 函数名称之后的括号中挂起。或者您可能更愿意获取作者的字符串属性,可能类似于todo.author.nickname,而无需调用str()
    • 我终于让它工作了!我在 if 语句中使用了 todo.author.nickname 并检查该值是否与当前用户的昵称匹配。请编辑您的答案以包括在内,以便我接受。
    【解决方案2】:

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

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

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

    在运行时

    print(user)
    

    它将调用函数__str__(self)并打印名字和姓氏

    【讨论】:

      【解决方案3】:

      str() 是等价的。

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

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

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

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

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

      【讨论】:

      • 感谢您的回复!我将继续尝试现在实现过滤器。我对昵称有点困惑。我以前玩过它,我能够像任何其他字符串一样操作它并通过模板值发送它就好了。我错过了什么吗?哦,作者是一个用户属性。我会将其添加到我原来的问题中。
      • 我不使用django模板,所以我不知道他们会做什么。一些模板系统会自动调用 callables (nickname())
      • 您介意简单解释一下过滤器的作用吗?我不确定我的 todos = Todo.all() 的实际功能是什么。
      • 从示例代码中可以看出,filter 是一个查询参数,特别是作者属性=某个值。你真的应该花一些时间阅读文档,它会为你节省很多时间。 developers.google.com/appengine/docs/python/datastore 谈论数据存储以及如何获取/放置和查询数据。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        在函数 post() 中:

        todo.author = users.get_current_user()
        

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

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

        我认为错误就在那里。

        【讨论】:

        • users.get_current_user() 返回一个 User 对象,该对象具有nickname() 为用户提供可读的名称。我无法正确获取昵称,但我想通了。谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 2012-11-30
        • 2010-09-20
        • 1970-01-01
        相关资源
        最近更新 更多