如果我的错误列表项之一是 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'å')
raises UnicodeEncodeError
。是否有充分的理由force_unicode
不lazy
使用smart_str
?我必须自己做,并以str
对象而不是 unicode 的形式提供错误消息才能使其工作。
所以我得到 TemplateSyntaxError Caught UnicodeEncodeError while rendering: 'ascii' codec can't encode character u'\xe5' in position 17: ordinal not in range(128)。这似乎说明渲染我的错误列表项(即u'å'
)导致第一个 UnicodeEncodeError 具有 unicode 消息'ascii' 编解码器无法编码字符 u'\xe5',然后是第二个 UnicodeEncodeError ,同时从第一个渲染消息。我弄错了吗?
Django 版本:1.3.1(但这似乎也发生在 1.4 中)
完整追溯:https ://raw.github.com/gist/2499077/ba60cb752acdb429dd6c2814ffb24272037a367a/UnicodeEncodeError.txt