2011-07-02 24 views
21

私はユニコードの性質を漠然と熟知していますが、どのようにすべての作品が合っているかわかりません。管理ページに特定のインスタンスを表示するときにエラーが発生しました。ここで管理ページのdjango unicodeエラー

Caught UnicodeEncodeError while rendering: 'ascii' codec can't encode character u'\u2019' in position 29: ordinal not in range(128)

は私のモデルです:

class Proposal(models.Model): 
    project = models.ForeignKey(Project) 
    dateCreated = models.DateTimeField(editable=False) 
    xml = models.TextField(max_length=1000000) 

    def __str__(self): 
     return str('Proposal for: %s' % self.project.name) 

私はmysqlデータベースに入ったとDB、テーブル、および列はすべてutf8_unicode_ci内と照合されているので、なぜ私は理解していないことを確認しましたページはasciiとしてレンダリングしようとしています。さまざまなフォーラムやドキュメントを見ると、strユニコードの機能が表示されていますが、インスタンスのリストが管理ページに表示されているため、これと関係がないようです。問題を引き起こす実際のインスタンスフォームを表示しているだけです。

ここで私はphpMyAdminのから引き出されたいくつかの例のXMLは、私も、意図的に私はそれをみたいので、私は長期的に行うことができないXMLを(除外しようとした...

<?xml version="1.0" encoding="UTF-8"?> 
<proposal> 

    <section title="OVERVIEW"> 
    <section title="Introduction"> 
     <text> 
    This proposal is not in the system because it was completed as an agreement in Word previous to us getting this application up and running. Please refer to the attachments in this project for documentation or to see the agreement. 
     </text> 
    </section> 
    </section> 
</proposal> 

です管理セクションで編集可能ですが)、私はまだ同じエラーが出ますので、xmlも問題ではないと確信しています。 xmlが問題ではない場合は、このページが表示されないように他に何ができるかわかりません。

class ProposalAdmin(admin.ModelAdmin): 
    exclude = ('xml',) 
admin.site.register(Project) 

答えて

38

どこか、おそらくself.project.name文字があります。エラーメッセージ全体をチェックすると、おそらくそれを見つけることができます。あなたは、データベースからユニコードの結果を取得している場合

しかし、おそらく、このような何かを賢く次のようになります。

def __str__(self): 
    return ('Proposal for: %s' % self.project.name).encode('ascii', errors='replace') 

それはrecommended by the Django documentationだから行う賢い事は、実装することです代わり__unicode__関数:

def __unicode__(self): 
    return u'Proposal for: %s' % self.project.name 
+1

ありがとうthe encode()trick - ps: 'encode( 'ascii'、 'replace')' –

+0

@Yuji Tomita、あなたはそれを両方の方法で呼ぶことができます。キーワードの引数やもの:http://docs.python.org/reference/expressions.html#calls –

+2

'encode()'はキーワード引数をとりません - 少なくとも2.6の場合 –

6

2019一般カーリーアポストロフィとして用い、RIGHT SINGLE QUOTATION MARKです。

問題はおそらくがあなたの代わりに__unicode____str__を使用することによって引き起こされで、Django's documentationはあなただけ__unicode__を使用することをお勧めします。

アポストロフィが含まれているフィールドが含まれていないため、インスタンスのリストが正常に表示される可能性があります。これは特にです

def __unicode__(self): 
    return 'Proposal for: %s' % self.project.name 

def __unicode__(self): 
    return u'Proposal for: %s' % self.project.name 

であるべき:

+0

upvoteは '__unicode__'勧告のために何十倍も!私は3時間のように、管理の詳細ビューでエラーが発生した理由を調べました。 __unicode__オーバーライドはそれを私のために修正しました。 –

5

これは

(私はアンドレさんにコメントとしてこれを追加したいが、まだ50ポイントを持っていません) unicodeの文字列を返す可能性のある別のモデルを参照する変数を定義内で使用している場合はtrueです。返されたテキストの前に "u"を入れて、すべてが正当なものであり、ユニコードとして返されるようにします。