2013-08-12 23 views
7

私は自分のウェブサイトを開発してロックを解除しようとしています。私はいくつかのレジストリページを作成し、データベースレコードをリストすることから始めます。なぜ__unicode__は動作しませんが、__str__は機能しますか?

そして、私は__unicode__メソッドは私のレコードのユーザー名を印刷しないと__str__はないという事実にうんざりしている!

そして私は__unicode__を使用するのがベストプラクティスだと知っていますが、私は__str__で自分のオブジェクトのユーザー名だけを印刷できます。

これはなぜ起こるのか誰でも説明できますか?

マイモデル:

from django.db import models 

class User(models.Model): 
    username = models.CharField(max_length=200) 
    reg_date = models.DateTimeField('registry date') 

    def __unicode__(self): 
     return self.username 

マイadmin.py:

from django.contrib import admin 
from registo.models import User 

admin.site.register(User) 

マイ__unicode__(self)出力:

User 
    User object 

マイ__str__(self)出力:

User 
    Teste 

事前に協力いただきありがとうございます。

+1

? – Sudipta

+0

こんにちはSudipta!あなたの素早い答えをありがとう! :)。 私は1.5.1バージョンを使用しています! ありがとう – Sammy

答えて

11

それはあなたがPython3.xを使用しているように見え、ここではPython 2ではrelevant documentation on Str and Unicode methods

で、オブジェクトモデルは__str__()__unicode__() 方法を指定します。これらのメソッドが存在する場合は、それぞれstr(バイト)と ユニコード(テキスト)を返す必要があります。

printステートメントとstr()組み込み呼び出し__str__()を使用して、オブジェクトの人間が読める表現を と決定します。 が存在する場合は__unicode__()を呼び出し、それ以外の場合は __str__()に戻り、結果をシステムエンコードでデコードします。逆に、Model基本クラスは、UTF-8にエンコードすることによってを __unicode__()から自動的に派生させます。

Python 3には、単に__str__()があり、str(text)を返す必要があります。

だから

は、Python 3では、デコレータは何もしません。 Python 2では、 の適切な__unicode__()__str__()のメソッドを定義しています(このプロセスでは オリジナルの__str__()メソッドを置き換えます)。

+0

こんにちはKarthikr!あなたの素早い答えをありがとう! :)。 だから、Python 3では単に__str__しかないので、私はオブジェクトから欲しいものを印刷するのにこれを使う必要があります。 こちらのドキュメントも貼り付けていただきありがとうございます。 :) – Sammy

+0

それは正しいです。互換性が必要な場合は、[python_2_unicode_compatible](https://docs.djangoproject.com/en/dev/ref/utils/#django.utils.encoding.python_2_unicode_compatible)デコレータ – karthikr

+0

を参照してください。私はあなたの助けに感謝します! バージョン「問題」なので、私の問題ではないのでちょっと安心しています:)。 もう一度お返事ありがとうございます! :) – Sammy

2

python 3のものではない場合、投稿されたコードにはインデントが間違っています。コピー/貼り付けのバグがあるか、それがコード内にあるかどうかはわかりません。しかし、あなたのUserモデルのメソッドはそうのように、インデントする必要があります:あなたが使用しているジャンゴのどのバージョン

from django.db import models 

class User(models.Model): 
    username = models.CharField(max_length=200) 
    reg_date = models.DateTimeField('registry date') 

    def __unicode__(self): 
     return self.username 
+0

クラスの外で 'self'を参照しても例外がスローされませんか? –

+0

関数が呼び出された場合は、必ず。しかし、示されているように、関数はモジュールレベルで定義されており、そのコードパスは決して呼び出されません。 – AdamKG

+0

こんにちはアダム!あなたの素早い答えをありがとう。 ...私はpyCharmを使用していますが、私は正しいと思います!私は詳細を知るためにコピー貼りを避けていますが、あなたのコード+アイデンティティを試しましたが、結果は同じでした! :/。 助けてくれてありがとう! :) – Sammy

関連する問題