PythonにはtoString()に相当するものがありますか?db.Model要素をStringに変換できますか?


90

私は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に変更すると、何か悪影響がありますか?たぶん私はキャストを完全にやめることができます。

回答:


96

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. 2013

1
その'str(todo.author)'ように引用符を付けてみてください。私はDjangoテンプレートの経験はありませんが、その解析メカニズムがstr関数名の後の括弧でハングアップしているようです。またはtodo.author.nicknamestr()呼び出しを必要とせずに、作成者の文字列プロパティ(おそらく、など)を取得することもできます。
ジェフロックハート2013年

ついに動作しました!ifステートメントでtodo.author.nicknameを使用し、その値が現在のユーザーのニックネームと一致するかどうかを確認しました。私がそれを受け入れることができるようにそれを含むようにあなたの答えを編集してください。
Amru E. 2013

37

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モデルのように作成者を定義する内容によって異なります。AStringPropertyまたはUserProperty

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


返信ありがとうございます!先に進んで、フィルターの実装を試みます。ニックネームについては少し混乱しています。私は以前にそれをいじってみましたが、他の文字列と同じように操作して、テンプレート値を介して問題なく送信することができました。私は何かが足りないのですか?ああ、作者はUserPropertyです。それを元の質問に追加します。
Amru E. 2013

私はdjangoテンプレートを使用していないので、それらが何をするのかわかりません。一部のテンプレートシステムは自動的に呼び出し可能オブジェクトを呼び出します(nickname())
Tim Hoffman 2013年

フィルタが何をするかを簡単に説明してもよろしいですか?todos = Todo.all()の実際の関数が何であるかわかりません。
Amru E. 2013

例のコードからわかるように、filterはクエリ引数であり、具体的にはauthor property = somevalueです。あなたは本当にドキュメントを読むのにいくらかの時間を費やす必要があります、それはあなたに多くの時間を節約するでしょう。 developers.google.com/appengine/docs/python/datastoreのデータストアとどのように取得する/ PUTとクエリデータについて協議。
ティムホフマン2013年

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()を持つUserオブジェクトを返します。ニックネームを正しく取得するのに苦労していましたが、わかりました。ありがとう!
Amru E. 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.