web-dev-qa-db-ja.com

Pythonと同等のtoString()があり、db.Model要素をStringに変換できますか?

Pythonを使い始めるのに役立つToDoリストアプリを書いています。アプリはGAEで実行されており、Todoアイテムをデータストアに保存しています。みんなのアイテムを彼らに、そして彼らだけに見せたい。問題は、アプリが現在すべてのアイテムをすべてのユーザーに表示するため、あなたが書いたものを見ることができ、あなたが書いたものを見ることができるということです。 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に変更すると、悪影響がありますか?キャストを完全にやめることができるかもしれません。

31
Amru E.

Pythonでは、 str() method は他の言語のtoString()メソッドに似ています。パラメータとして文字列に変換するオブジェクトを渡すと呼ばれます。内部的には、パラメータオブジェクトの__str__()メソッドを呼び出して、文字列表現を取得します。

ただし、この場合は、データベースのUserProperty作成者を比較しています。これは、タイプ users.User のニックネーム文字列です。代わりに、作成者のnicknameプロパティをテンプレートのtodo.author.nicknameと比較する必要があります。

50
Jeff Lockhart

str()は同等です。

ただし、クエリをフィルタリングする必要があります。現在、クエリはall() Todoです。

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

または

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

todoモデルのように作成者を定義しているものによって異なります。 StringPropertyまたはUserProperty

nicknameはメソッドです。テンプレート値の結果ではなくメソッドを渡します。

3
Tim Hoffman

関数post()で:

todo.author = users.get_current_user()

したがって、str(todo.author)を取得するには、str(users.get_current_user())が必要です。 get_current_user()関数によって何が返されますか?

オブジェクトの場合、str() "関数が含まれているかどうかを確認しますか?

エラーはそこにあると思います。

2
sinhayash

モデルで__unicode__メソッドを定義する必要があります。インスタンスを参照すると、テンプレートは自動的にそれを呼び出します。

2
Daniel Roseman

in Python __str __()methonを使用できます。

このようにクラスでオーバーロードできます:

    class User : 

    firstName=''
    lastName=''
    ...

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

そして作るとき

print(user)

次にfirstNameとlastNameを出力します

0