Apakah Python memiliki toString () yang setara, dan dapatkah saya mengonversi elemen db.Model ke String?

90

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.

Amru E.
sumber

Jawaban:

96

Di python, str()metodenya mirip dengan toString()metode dalam bahasa lain. Ini disebut meneruskan objek untuk diubah menjadi string sebagai parameter. Secara internal ia memanggil __str__()metode objek parameter untuk mendapatkan representasi stringnya.

Namun, dalam kasus ini, Anda membandingkan UserPropertypengarang dari database, yang bertipe users.Userdengan string nama panggilan. Anda akan ingin membandingkan nicknameproperti penulis sebagai gantinya dengan todo.author.nicknamedi template Anda.

Jeff Lockhart
sumber
Terima kasih atas jawabannya. Saya mendapatkan kesalahan berikut saat mencoba str (todo.author) di template: TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'ada ide?
Amru E.
1
Coba letakkan kutipan 'str(todo.author)'seperti itu. Saya tidak berpengalaman dengan cetakan Django, tetapi nampaknya mekanisme penguraiannya ditutup pada tanda kurung setelah strnama fungsi. Atau Anda mungkin lebih suka mendapatkan properti string dari author, mungkin sesuatu seperti itu todo.author.nickname, tanpa perlu str()panggilan.
Jeff Lockhart
Saya akhirnya berhasil! Saya menggunakan todo.author.nickname di pernyataan if saya dan memeriksa apakah nilai itu cocok dengan nama panggilan pengguna saat ini. Harap edit jawaban Anda untuk menyertakannya sehingga saya dapat menerimanya.
Amru E.
37

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

print(user)

itu akan memanggil fungsi __str__(self) dan mencetak firstName dan lastName

Amirouche Zeggagh
sumber
6

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 StringPropertyatau UserProperty.

Catatan nicknameadalah sebuah metode. Anda meneruskan metode dan bukan hasilnya dalam nilai template.

Tim Hoffman
sumber
Terima kasih atas balasannya! Saya akan melanjutkan dan mencoba menerapkan filter sekarang. Aku agak bingung dengan nama panggilannya. Saya telah bermain-main dengannya sebelumnya dan saya dapat memanipulasinya seperti string lain dan mengirimkannya melalui nilai templat dengan baik. Apakah saya melewatkan sesuatu? Oh dan penulis adalah UserProperty. Saya akan menambahkannya ke pertanyaan awal saya.
Amru E.
Saya tidak menggunakan template django, jadi saya tidak tahu apa yang akan mereka lakukan. Beberapa sistem template secara otomatis akan memanggil callables (nickname ())
Tim Hoffman
Apakah Anda keberatan menjelaskan secara singkat apa yang akan dilakukan filter? Saya tidak yakin apa fungsi sebenarnya dari my todos = Todo.all ().
Amru E.
Seperti yang Anda lihat dari kode contoh, filter adalah argumen kueri, khususnya properti pengarang = beberapa nilai. Anda benar-benar harus meluangkan waktu untuk membaca dokumen, ini akan menghemat banyak waktu. developers.google.com/appengine/docs/python/datastore berbicara tentang datastore dan cara mendapatkan / menempatkan dan melakukan kueri data.
Tim Hoffman
2

Anda harus menentukan __unicode__metode pada model Anda, dan template akan memanggilnya secara otomatis saat Anda mereferensikan instance.

Daniel Roseman
sumber
2

Di function post ():

todo.author = users.get_current_user()

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.

sinhayash.dll
sumber
users.get_current_user () mengembalikan objek Pengguna yang memiliki nama panggilan () untuk memberikan nama yang dapat dibaca untuk pengguna. Saya kesulitan mendapatkan nama panggilan dengan benar, tetapi saya berhasil menemukannya. Terima kasih!
Amru E.