我有新聞條目的簡單的Django模型:DjangoUnicodeDecodeError和force_unicode
class NewsEntry(models.Model):
pub_date = models.DateTimeField('date published')
title = models.CharField(max_length = 200)
summary = models.TextField()
content = models.TextField()
def __unicode__(self):
return self.title
添加新的消息(在管理頁面)與英文文本工作正常,但是當我嘗試與俄文本添加新聞出現錯誤:
TemplateSyntaxError at /admin/news/newsentry/
Caught DjangoUnicodeDecodeError while rendering: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128). You passed in NewsEntry: [Bad Unicode data] (class 'antek.news.models.NewsEntry')
Django Version: 1.2.2
Exception Type: TemplateSyntaxError
Exception Value: Caught DjangoUnicodeDecodeError while rendering: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128). You passed in NewsEntry: [Bad Unicode data] (class 'antek.news.models.NewsEntry')
Exception Location: /usr/local/lib/python2.6/dist-packages/django/utils/encoding.py in >force_unicode, line 88
Python Version: 2.6.5
在回溯列表中的最後一項是:
/usr/local/lib/python2.6/dist-packages/django/utils/encoding.py in force_unicode
Local vars:
e: UnicodeDecodeError('ascii', '\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82 \xd1\x80\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xbe\xd0\xb3\xd0\xbe', 0, 1, 'ordinal not in range(128)')
代碼看起來是正確的:self.title是unicode對象。此外,djangoproject.com在其blog application中使用類似的代碼。
我花了很多時間來解決這個問題,併成立奇怪的解決方案:
from django.utils.encoding import force_unicode
# ...
def __unicode__(self):
return force_unicode(self.title)
但由於self.title是unicode的對象,force_unicode應該沒有任何變化返回。
爲什麼return self.title
不起作用?
我不認爲'self.title'是一個Unicode對象。根據錯誤,它是一個字節字符串(包含UTF-8西裏爾字母)。你是如何得到這個字符串的?通常閱讀表單提交應該給你Unicode。 – bobince 2010-09-26 14:52:31
是的,我同意。但是,當我在__unicode__方法中寫入類似「return self.title.foo()」的東西時,在保存新聞時存在AttributeError:「'unicode'對象沒有屬性'foo'」。 – Kirill 2010-09-26 15:17:12