2013-01-21 1 views
0

У меня есть форма в web.py, которая отлично отображается благодаря string.decode ('utf-8'), но когда она отправляется, я получаю 'ascii' codec can't encode character u'\xf6' in position 1: ordinal not in range(128) from web/form.py in attrget, строка 17.web.py Ошибка формы.validates() с символом utf-8 в имени атрибута

Этот код выглядит так, строка 17 - это, в частности, проход в исключающем блоке.

def attrget(obj, attr, value=None): 
    try: 
     if hasattr(obj, 'has_key') and obj.has_key(attr): 
      return obj[attr] 
    except TypeError: 
     # Handle the case where has_key takes different number of arguments. 
     # This is the case with Model objects on appengine. See #134 
     pass 
    if hasattr(obj, attr): 
     return getattr(obj, attr) 
    return value 

Это должно быть что-то о кодировании, потому что форма работает, если я удаляю шведский символ ö. Вот определение формы.

searchForm = form.Form(
    form.Textbox('Startdatum', id='datepickerStart'), 
    form.Textbox('Slutdatum', id='datepickerEnd'), 
    form.Textbox('IPadress', validIPaddress), 
    form.Textbox('Macadress', validMacaddress), 
    form.Button('Sök'.decode('utf-8'), type='submit', description='Search') 
) 

Третья строка, вызывающая Form.validates(), находится там, где она запускается.

def POST(self): 
    form = self.searchForm() 
    if not form.validates(): 
     headerMsg = 'Du skrev något fel, gör om, gör rätt.'.decode('utf-8') 
     return tpl.index(headerMsg, form) 

    return tpl.index(headerMsg='Inga rader hittades', form=form) 

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

Traceback (most recent call last): 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.37-py2.6.egg/web/application.py", line 239, in process 
return self.handle() 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.37-py2.6.egg/web/application.py", line 230, in handle 
    return self._delegate(fn, self.fvars, args) 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.37-py2.6.egg/web/application.py", line 420, in _delegate 
    return handle_class(cls) 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.37-py2.6.egg/web/application.py", line 396, in handle_class 
    return tocall(*args) 
    File "/home/mkbnetadm/netadmin/na.py", line 36, in POST 
    if not form.validates(): 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.37-py2.6.egg/web/form.py", line 76, in validates 
    v = attrget(source, i.name) 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.37-py2.6.egg/web/form.py", line 18, in attrget 
    if hasattr(obj, attr): 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 1: ordinal not in range(128) 

Так что я могу сделать, чтобы избежать этой ошибки при создании форм в web.py?

+0

Я не понимаю, все это использование ' 'Sök'.decode (' UTF- 8') '. Почему бы не использовать Unicode в первую очередь: 'u'Sök''? –

+0

, который является строкой 17? –

+0

@ DanielRoseman Использование uString также работает, но не решает проблему. –

ответ

0

Имена атрибутов, как и все идентификаторы, должны быть (раскладывается в) ASCII:

[Python 2.6.6] 
>>> foo = object() 
>>> hasattr(foo, 'o') 
False 
>>> hasattr(foo, u'o') 
False 
>>> hasattr(foo, u'\xf6') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0: 
ordinal not in range(128) 
>>> 

См http://docs.python.org/2/reference/lexical_analysis.html#identifiers

+0

Код, который я делал, должен был использовать jquery в конечном итоге для отправки и проверки формы, поэтому я работал над этой проблемой, продвигая это и не используя встроенную проверку формы web.py. Но, поскольку вы, вероятно, правы, я буду отмечать ваше сообщение как ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^