2013-12-17 2 views
3

Я бегу в проблему с входом Unicode в форме с Джанго:Джанго: Как обеспечить правильную кодировку ввода отправленное через форму

UnicodeEncodeError at/

'ascii' codec can't encode character u'\xe4' in position 7: ordinal not in range(128) 

Это происходит с gunicorn, а также работает в Django режим отладки. Мой form.py включен юникода:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

from django import forms 
from django.core.mail import send_mail 
from django.core.mail import EmailMessage 
import datetime 

class RTForm(forms.Form): 
     # ... 
     institution_station = forms.CharField(max_length=75, label=u"Institute/Station*") 
     # ... 

мнение создается на основе, что с целью создания на электронную почту от ввода:

class RTview(FormView): 
     template_name = 'rt-form.html' 
     form_class = RTForm 
     success_url = '/thanks/' 

     def form_valid(self, form): 
      # This method is called when valid form data has been POSTed. 
      # It should return an HttpResponse. 
      form.send_email() 
      return super(RTview, self).form_valid(form) 

Функция send_email выглядит следующим образом:

def send_email(self): 

    email = EmailMessage(
       subject='New item', 
       #body='Here is the message.', 
       from_email=self.cleaned_data['email'], 
       to=['[email protected]']) 

    # The dict fields of the form contains all defined fields incl. 
    # their labels etc. So taking this we can match and check for the 
    # validated data to fullfill our task. 
    values = [] 
    for i in self.fields.iteritems(): 
     values.append(u"%s: \t%s" % (self[i[0]].label, str(self.cleaned_data[i[0]]))) 

    email.body = "\n".join(values) 

    email.send() 

при вводе Юникода в institution_station, приложение отвечает вышеуказанной ошибки, в противном случае при values.append() в send_email.

отслеживающий выглядит следующим образом:

Internal Server Error:/
Traceback (most recent call last): 
    File "/home/frlan/.virtualenvs/gascylinders/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/home/frlan/.virtualenvs/gascylinders/local/lib/python2.7/site-packages/django/views/generic/base.py", line 69, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "/home/frlan/.virtualenvs/gascylinders/local/lib/python2.7/site-packages/django/views/generic/base.py", line 87, in dispatch 
    return handler(request, *args, **kwargs) 
    File "/home/frlan/.virtualenvs/gascylinders/local/lib/python2.7/site-packages/django/views/generic/edit.py", line 171, in post 
    return self.form_valid(form) 
    File "/home/frlan/quellen/git/gascylinders-rt-frontend/gascylinders/rtfrontend/views.py", line 12, in form_valid 
    form.send_email() 
    File "/home/frlan/quellen/git/gascylinders-rt-frontend/gascylinders/rtfrontend/forms.py", line 124, in send_email 
    values.append(u"%s: \t%s" % (self[i[0]].label, str(self.cleaned_data[i[0]]))) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 7: ordinal not in range(128) 

Что может я пропустил?

+0

Просто добавлена ​​трассировка. Происходит, например. при вставке немецких Umlauts. – frlan

ответ

5

Я думаю, что проблема здесь звонит str(self.cleaned_data[i[0]]), что создает байты строку из значения Юникода. Для примера u"%s" % str(u"überwach!") потерпит неудачу, где u"%s" % unicode(u"überwach!") будет работать нормально (даже если unicode вызов является излишним в этом случае ...)

Edit: добавить некоторые детали: str(u"überwach!") терпит неудачу с UnicodeEncodeError, потому что под капотом, он вызывает u"überwach!".encode("ascii"), но ASCII не может обрабатывать умляуты ...

к сожалению, я не смог найти эту beaviour в документации (str() вызовов __str__ на unicode объекта, но как это __str__ реализовано?), но и для более на эту тему, см. Python Unicode Howto.

+0

Да, это сделал трюк! – frlan

3

Строки вставка не юникод

Попробуйте это:

values.append(u"%s: \t%s" % (unicode(self[i[0]].label), unicode(self.cleaned_data[i[0]]))) 
Смежные вопросы