Python'un toString () eşdeğeri var mı ve bir db.Model öğesini String'e dönüştürebilir miyim?


90

Python ile başlamama yardımcı olmak için bir Yapılacaklar listesi uygulaması yazıyorum. Uygulama GAE üzerinde çalışıyor ve ben yapılacak işler Veri Deposu'nda depoluyorum. Herkesin eşyalarını onlara ve tek başlarına göstermek istiyorum. Sorun, uygulamanın şu anda tüm öğeleri tüm kullanıcılara göstermesidir, böylece ne yazdığınızı ve ne yazdığımı görebilirim. Todo.author nesnemi bir dizeye atmanın ve kullanıcının adıyla eşleşip eşleşmediğini görmenin iyi bir başlangıç ​​olacağını düşündüm, ancak bunu nasıl yapacağımı bulamıyorum.

Bu benim main.py dosyamda bulunan

... 
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('/')

İndex.html dosyamda orijinal olarak şuna sahiptim:

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

ancak öğeleri yalnızca onları oluşturan kullanıcıya görüntülemek istiyorum. Denemeyi düşündüm

{% for todo in todos %}
    {% ifequal todo.author nickname %}
  <input type="checkbox"> {{todo.item}} <hr />
    {% endifequal %}
{% endfor %}

boşuna. Liste boş çıkıyor. Bunun todo.author'un bir dize olmaması olduğunu varsaydım. Değeri bir dize olarak okuyabilir miyim, yoksa nesneyi String'e çevirebilir miyim?

Teşekkürler!

Düzenleme: İşte benim Todo dersim

class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)

Yazarımı StringProperty olarak değiştirmek herhangi bir şeyi olumsuz etkiler mi? Belki oyuncu seçiminden tamamen vazgeçebilirim.

Yanıtlar:


96

Python'da, str()yöntem benzerdir toString()diğer dillerde yöntemle. Parametre olarak bir dizgeye dönüştürmek için nesnenin iletilmesi denir. Dahili olarak __str__(), dize temsilini almak için parametre nesnesinin yöntemini çağırır .

Ancak bu durumda, UserPropertyveri tabanındaki bir yazarı users.Usertakma ad dizesiyle karşılaştırıyorsunuz. Bunun nicknameyerine yazarın özelliğini todo.author.nicknameşablonunuzla karşılaştırmak isteyeceksiniz .


Cevap için teşekkürler. Şablonda str (todo.author) denerken şu hatayı alıyorum: TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'herhangi bir fikir?
Amru E.

1
Bu şekilde alıntı yapmayı deneyin 'str(todo.author)'. Django şablonları konusunda deneyimli değilim, ancak ayrıştırma mekanizması strişlev adından sonra paranteze takılıyor gibi görünüyor . Veya çağrıya todo.author.nicknamegerek kalmadan yazarın string özelliğini, muhtemelen buna benzer bir şeyi almayı tercih str()edebilirsiniz.
Jeff Lockhart

Sonunda işe yaradım! İf deyimimde todo.author.nickname kullandım ve bu değerin mevcut kullanıcının takma adıyla eşleşip eşleşmediğini kontrol ettim. Lütfen yanıtınızı bunu içerecek şekilde düzenleyin, böylece onu kabul edebilirim.
Amru E.

37

Python'da __str__()yöntemi kullanabiliriz .

Bunu sınıfımızda şu şekilde geçersiz kılabiliriz:

class User: 

    firstName = ''
    lastName = ''
    ...

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

ve koşarken

print(user)

işlevi çağırır __str__(self) ve firstName ve lastName'i yazdırır


6

str() eşdeğerdir.

Ancak sorgunuzu filtrelemelisiniz. Şu anda sorgunuz all()Todo's.

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

veya

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

Todo modelinde olduğu gibi yazarı tanımladığına bağlı olarak. A StringPropertyveya UserProperty.

Not nicknamebir yöntemdir. Şablon değerlerinde sonucu değil, yöntemi geçiriyorsunuz.


Cevap için teşekkürler! Şimdi devam edip filtreyi uygulamaya çalışacağım. Yine de takma ad konusunda kafam biraz karıştı. Daha önce onunla oynadım ve onu herhangi bir dizge gibi değiştirebildim ve şablon değeri aracılığıyla gayet iyi gönderebildim. Bir şey mi kaçırıyorum? Oh ve yazar bir Kullanıcı Özelliğidir. Bunu orijinal soruma ekleyeceğim.
Amru E.

Django şablonları kullanmıyorum, bu yüzden ne yapacaklarını bilmiyorum. Bazı şablon sistemleri otomatik olarak çağrılabilirleri çağırır (nickname ())
Tim Hoffman

Filtrenin ne yapacağını kısaca açıklamanın bir sakıncası var mı? Todos = Todo.all () işlevinin gerçek işlevinin ne olduğundan emin değilim.
Amru E.

Örnek koddan da görebileceğiniz gibi, filtre bir sorgu bağımsız değişkenidir, özellikle yazar özelliği = bir değerdir. Gerçekten dokümanları okumak için biraz zaman harcarsınız, bu size çok zaman kazandıracaktır. Developers.google.com/appengine/docs/python/datastore , veri deposu ve verilerin nasıl alınacağı / konulacağı ve sorgulanacağı hakkında konuşuyor.
Tim Hoffman

2

__unicode__Yöntemi modelinizde tanımlamalısınız ve örneğe başvurduğunuzda şablon onu otomatik olarak çağıracaktır.


2

İşlev gönderisinde ():

todo.author = users.get_current_user()

Yani, str (todo.author) elde etmek için str (users.get_current_user ()) gerekir. Get_current_user () işlevi ile ne döndürülür?

Bir nesne ise, bir str () "işlevi içerip içermediğini kontrol edin ?

Sanırım hata orada yatıyor.


users.get_current_user (), kullanıcıya okunabilir bir ad sağlamak için nickname () 'ye sahip bir User nesnesi döndürür. Takma adı doğru bulmakta sorun yaşıyordum ama anladım. Teşekkürler!
Amru E.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.