【发布时间】:2012-04-26 11:41:20
【问题描述】:
如果我的错误列表项之一是 unicode,我在渲染 Django 的 ErrorList 时遇到问题。当 Django 呈现我的错误列表时
{{ form.non_field_errors }}
class ErrorList(list, StrAndUnicode):
"""
A collection of errors that knows how to display itself in various formats.
"""
def __unicode__(self):
return self.as_ul()
def as_ul(self):
if not self: return u''
return mark_safe(u'<ul class="errorlist">%s</ul>'
% ''.join([u'<li>%s</li>' % conditional_escape(force_unicode(e)) for e in self]))
然后在force_unicode:
s = unicode(str(s), encoding, errors)
然后在lazy中翻译:
def __str_cast(self):
return str(self.__func(*self.__args, **self.__kw))
问题是我的字符串包含“å”符号并且str(u'å') 引发UnicodeEncodeError。 force_unicode 和 lazy 不使用 smart_str 有充分的理由吗?我必须自己做,并以 str 对象而不是 unicode 的形式提供错误消息才能使其正常工作。
所以我得到 TemplateSyntaxError 在渲染时捕获 UnicodeEncodeError:'ascii' 编解码器无法在位置 17 编码字符 u'\xe5':序数不在范围内(128)。这似乎说明渲染我的错误列表项(即u'å')导致第一个 UnicodeEncodeError 具有 unicode 消息 'ascii' codec can't encode character u'\xe5' 然后第二个 UnicodeEncodeError 在渲染时来自第一个的消息。我弄错了吗?
Django 版本:1.3.1(但这似乎也发生在 1.4 中)
完整回溯:https://raw.github.com/gist/2499077/ba60cb752acdb429dd6c2814ffb24272037a367a/UnicodeEncodeError.txt
【问题讨论】: