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に変更すると、悪影響がありますか?キャストを完全にやめることができるかもしれません。
Pythonでは、 str()
method は他の言語のtoString()
メソッドに似ています。パラメータとして文字列に変換するオブジェクトを渡すと呼ばれます。内部的には、パラメータオブジェクトの__str__()
メソッドを呼び出して、文字列表現を取得します。
ただし、この場合は、データベースのUserProperty
作成者を比較しています。これは、タイプ users.User
のニックネーム文字列です。代わりに、作成者のnickname
プロパティをテンプレートのtodo.author.nickname
と比較する必要があります。
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
はメソッドです。テンプレート値の結果ではなくメソッドを渡します。
関数post()で:
todo.author = users.get_current_user()
したがって、str(todo.author)を取得するには、str(users.get_current_user())が必要です。 get_current_user()関数によって何が返されますか?
オブジェクトの場合、str() "関数が含まれているかどうかを確認しますか?
エラーはそこにあると思います。
モデルで__unicode__
メソッドを定義する必要があります。インスタンスを参照すると、テンプレートは自動的にそれを呼び出します。
in Python __str __()methonを使用できます。
このようにクラスでオーバーロードできます:
class User :
firstName=''
lastName=''
...
def __str__(self):
return self.firstName +" "+self.lastName
そして作るとき
print(user)
次にfirstNameとlastNameを出力します