id,summary,reporter,owner,description,type,status,component,version,severity,resolution,keywords,cc,stage,has_patch,needs_docs,needs_tests,needs_better_patch,easy,ui_ux 3370,[patch] newforms: form.save() raises UnicodeEncodeError when form contains any non latin characters,anton@…,Adrian Holovaty,"Hello everyone I've found the following bug with newforms: when one uses form_for_model/form_for_instance methods and then does save() and form contains any non-latin (national) characters, UnicodeEncodeError is raised. Example (console encoding = ru_RU.UTF-8) {{{ >>> from myproject.models import Payment >>> from django import newforms as forms }}} Let's try form_for_model: {{{ >>> PaymentForm1 = forms.models.form_for_model(Payment) >>> form1 = PaymentForm1({'description': 'превед now', 'event_date': '2007-01-26', 'user': '1', 'pay_type': 'cash', 'amount':'50.3'}) >>> form1.is_valid() True >>> form1.save() Traceback (most recent call last): File """", line 1, in ? File ""/usr/lib/python2.4/site-packages/django/newforms/models.py"", line 25, in model_save obj.save() File ""/usr/lib/python2.4/site-packages/netangels/models/payment.py"", line 26, in save super(Payment, self).save() File ""/usr/lib/python2.4/site-packages/django/db/models/base.py"", line 204, in save ','.join(placeholders)), db_values) File ""/usr/lib/python2.4/site-packages/MySQLdb/cursors.py"", line 148, in execute query = query % db.literal(args) File ""/usr/lib/python2.4/site-packages/MySQLdb/connections.py"", line 232, in literal return self.escape(o, self.encoders) File ""/usr/lib/python2.4/site-packages/MySQLdb/connections.py"", line 179, in unicode_literal return db.literal(u.encode(unicode_literal.charset)) UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-5: ordinal not in range(256) }}} now let's try form_for_instance {{{ >>> payment = Payment.objects.get(pk=2) >>> PaymentForm2 = forms.models.form_for_instance(payment) >>> form2 = PaymentForm2({'description': 'превед now', 'event_date': '2007-01-26', 'user': '1', 'pay_type': 'cash', 'amount':'50.3'}) >>> form2.is_valid() True >>> form2.save() Traceback (most recent call last): File """", line 1, in ? File ""/usr/lib/python2.4/site-packages/django/newforms/models.py"", line 52, in save return save_instance(self, instance, commit) File ""/usr/lib/python2.4/site-packages/django/newforms/models.py"", line 46, in save_instance instance.save() File ""/usr/lib/python2.4/site-packages/netangels/models/payment.py"", line 26, in save super(Payment, self).save() File ""/usr/lib/python2.4/site-packages/django/db/models/base.py"", line 184, in save db_values + [pk_val]) File ""/usr/lib/python2.4/site-packages/MySQLdb/cursors.py"", line 148, in execute query = query % db.literal(args) File ""/usr/lib/python2.4/site-packages/MySQLdb/connections.py"", line 232, in literal return self.escape(o, self.encoders) File ""/usr/lib/python2.4/site-packages/MySQLdb/connections.py"", line 179, in unicode_literal return db.literal(u.encode(unicode_literal.charset)) UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-5: ordinal not in range(256) }}} and one more little example: {{{ >>> form2.clean_data['description'] = 'превед in unicode' >>> form2.save() }}} it works because description is of type 'str', but contains Unicode characters. ",,closed,Forms,dev,,fixed,newforms utf8 unicode-branch,Maniac@… jm.bugtracking@… densetsu.no.ero.sennin@…,Accepted,1,0,1,1,0,0