Saya menulis aplikasi daftar ToDo untuk membantu diri saya sendiri memulai Python. Aplikasi ini berjalan di GAE dan saya menyimpan item rencana di Data Store. Saya ingin menampilkan item semua orang kepada mereka, dan mereka sendiri. Masalahnya adalah aplikasi saat ini menampilkan semua item ke semua pengguna, jadi saya dapat melihat apa yang Anda tulis, dan Anda melihat apa yang saya tulis. Saya pikir mentransmisikan objek todo.author saya ke string dan melihat apakah itu cocok dengan nama pengguna akan menjadi awal yang baik, tetapi saya tidak tahu bagaimana melakukan itu.
Inilah yang saya miliki di main.py saya
...
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('/')
Di index.html saya memiliki ini awalnya:
<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>
tapi saya ingin menampilkan item hanya kepada pengguna yang membuatnya. Saya berpikir untuk mencoba
{% for todo in todos %}
{% ifequal todo.author nickname %}
<input type="checkbox"> {{todo.item}} <hr />
{% endifequal %}
{% endfor %}
tidak berhasil. Daftar tersebut ternyata kosong. Saya berasumsi itu karena todo.author bukanlah sebuah string. Dapatkah saya membaca nilai sebagai string, atau dapatkah saya mentransmisikan objek ke String?
Terima kasih!
Edit: Ini kelas Todo saya
class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)
Akankah mengubah penulis saya menjadi StringProperty berpengaruh negatif? Mungkin aku bisa melupakan casting sama sekali.
TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'
ada ide?'str(todo.author)'
seperti itu. Saya tidak berpengalaman dengan cetakan Django, tetapi nampaknya mekanisme penguraiannya ditutup pada tanda kurung setelahstr
nama fungsi. Atau Anda mungkin lebih suka mendapatkan properti string dari author, mungkin sesuatu seperti itutodo.author.nickname
, tanpa perlustr()
panggilan.Dengan Python kita bisa menggunakan
__str__()
metode ini.Kita bisa menggantinya di kelas kita seperti ini:
class User: firstName = '' lastName = '' ... def __str__(self): return self.firstName + " " + self.lastName
dan saat berlari
itu akan memanggil fungsi
__str__(self)
dan mencetak firstName dan lastNamesumber
str()
adalah setara.Namun Anda harus memfilter kueri Anda. Saat ini pertanyaan Anda adalah
all()
Todo.todos = Todo.all().filter('author = ', users.get_current_user().nickname())
atau
todos = Todo.all().filter('author = ', users.get_current_user())
tergantung pada apa yang Anda definisikan penulis seperti pada model Todo. A
StringProperty
atauUserProperty
.Catatan
nickname
adalah sebuah metode. Anda meneruskan metode dan bukan hasilnya dalam nilai template.sumber
Anda harus menentukan
__unicode__
metode pada model Anda, dan template akan memanggilnya secara otomatis saat Anda mereferensikan instance.sumber
Di function post ():
Jadi, untuk mendapatkan str (todo.author), Anda membutuhkan str (users.get_current_user ()). Apa yang dikembalikan oleh fungsi get_current_user ()?
Jika itu adalah sebuah objek, periksa apakah itu berisi fungsi str () "?
Saya pikir kesalahannya terletak di sana.
sumber