如果我的错误列表项之一是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 Caught UnicodeEncodeError:'ascii'编解码器无法编码位置17的字符u'\ xe5':序号不在范围内(128)。这似乎告诉我渲染我的错误列表项(u'å'
)导致第一个UnicodeEncodeError具有unicode消息'ascii'编解码器无法编码字符u'\ xe5'然后编码第二个UnicodeEncodeError从第一个渲染消息时。我错了吗?
Django版本:1.3.1(但这似乎也发生在1.4中)
完整追溯:https://raw.github.com/gist/2499077/ba60cb752acdb429dd6c2814ffb24272037a367a/UnicodeEncodeError.txt
答案 0 :(得分:0)
您可以使用包含标记或non_field_errors
手动呈现{% include %}
(以及整个表单)。这不是直接的解决方案,但它解决了问题,而且更加灵活。