On 4/26/12, Andrei <andrei.fo...@gmail.com> wrote: > Hi, > > I am having an issue with rendering Django's ErrorList if one of my error > list items is unicode. When Django renders my errorlist > > {{ form.non_field_errors }} > > it runs the following > code<https://github.com/django/django/blob/1.3.1/django/forms/util.py#L46> > : > > 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])) > > then in > force_unicode<https://github.com/django/django/blob/1.3.1/django/utils/encoding.py#L74> > : > > s = unicode(str(s), encoding, errors) > > and then translation in > lazy<https://github.com/django/django/blob/1.3.1/django/utils/functional.py#L209> > : > > def __str_cast(self): > return str(self.__func(*self.__args, **self.__kw)) > > The problem is that my string contains 'å' symbol and str(u'å') raises > UnicodeEncodeError. Is there a good reason why force_unicode and lazy do > not use smart_str? I have to do it myself and provide error messages as str > objects > instead of unicode to make it work. > > So I get TemplateSyntaxError *Caught UnicodeEncodeError while rendering: > 'ascii' codec can't encode character u'\xe5' in position 17: ordinal not in > range(128)*. This seems telling that rendering my error list item (which is > u'å') caused the first UnicodeEncodeError having unicode message *'ascii' > codec can't encode character u'\xe5'* and then second UnicodeEncodeError > while rendering the message from the first one. Am I mistaken? > > Django version: 1.3.1 (but this seems to happen in 1.4 as well) > > Full traceback: > https://raw.github.com/gist/2499077/ba60cb752acdb429dd6c2814ffb24272037a367a/UnicodeEncodeError.txt > http://stackoverflow.com/questions/10332674/django-unicodeencodeerror-in-errorlist > > Thanks, > Andrei
I *think* that there's only one exception here. The nested force_unicode calls probably aren't unusual. A possible work around for you would be to set the python interpreter's default string encoding to utf-8. Then that call to str() inside __str_cast() on a unicode string containing a non ASCII character would work. Whether or not this is a weakness in the django.utils is above my pay grade. -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.