2016-06-12 3 views
1

Ich portiere meine Seite nach django 1.9 und weiß nicht, wie ich dieses Problem richtig lösen kann.DjangoUnicodeDecodeError beim Aufruf von form.errors mit EmailField

In meiner Form habe ich übliche EmailField von django Formen. Wenn die Validierung fehlschlägt, sollte es eine Nachricht darüber sein (ich übergebe 'form_errors': form.errors} an den Kontext für die Manipulation).

Aber in diesem Fall django kehrt

DjangoUnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128). You passed in ()

in django.core.validators ein Validator für sie ist

@deconstructible 
class EmailValidator(object): 
    message = _('Enter a valid email address.') 
    ... 

Wenn ich Nachricht alles funktioniert gut zu message = 'error' ändern.

Also, Frage: Wie kann ich dieses Problem beheben, ohne django-Dateien zu bearbeiten?

Das Problem ist in Aufruf von form.errors, dieser Fehler zu erhöhen, auch wenn ich nur es drucken möchte. (print form.errors). Andere Felder Fehler (IntegerField, URLField, zum Beispiel) funktioniert gut, dieses Problem ist nur für EmailField.

im Hinblick Prozess sieht aus wie das jetzt:

from django.http import JsonResponse 
... 

if form.is_valid(): 
    ... 
else: 
    return JsonResponse({'form_errors': form.errors}) 

letzte Zurückverfolgungs ist:

File "/path/views.py", line 331, in custom_form_post 
    response = JsonResponse({'form_errors': form.errors}) 
    File "/path/.env/local/lib/python2.7/site-packages/django/http/response.py", line 505, in __init__ 
    data = json.dumps(data, cls=encoder, **json_dumps_params) 
    File "/usr/lib/python2.7/json/__init__.py", line 250, in dumps 
    sort_keys=sort_keys, **kw).encode(obj) 
    File "/usr/lib/python2.7/json/encoder.py", line 207, in encode 
    chunks = self.iterencode(o, _one_shot=True) 
    File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode 
    return _iterencode(o, 0) 
    File "/path/.env/lib/python2.7/_abcoll.py", line 581, in __iter__ 
    v = self[i] 
    File "/path/.env/local/lib/python2.7/site-packages/django/forms/utils.py", line 146, in __getitem__ 
    return list(error)[0] 
    File "/path/.env/local/lib/python2.7/site-packages/django/core/exceptions.py", line 165, in __iter__ 
    yield force_text(message) 
    File "/path/.env/local/lib/python2.7/site-packages/django/utils/encoding.py", line 88, in force_text 
    raise DjangoUnicodeDecodeError(s, *e.args) 
DjangoUnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128). You passed in <django.utils.functional.__proxy__ object at 0x40a6a90c> (<class 'django.utils.functional.__proxy__'>) 
+2

Pl Zeigen Sie den gesamten Traceback, Ihre Ansicht und Ihre Vorlage. Beachten Sie, dass 'form.errors' bereits ein Wörterbuch ist - ich sehe nicht, warum Sie' items() 'aufrufen und dann das Ergebnis zurück in ein Wörterbuch konvertieren. – Alasdair

+1

^aktualisiert. und Danke für Tipp über 'form.errors' - dort übersteuert :) – user1931780

Antwort

1

Well. Das Problem liegt in Übersetzungen. In diesem Fall - russische Lokalisierung. Keine Ahnung, warum die Übersetzung von "nativen" Django-Lokalisierungsdateien fehlgeschlagen ist. Aber für alle, die ähnlichen Probleme haben:

  1. erstellen (falls noch nicht) locale Datei (https://docs.djangoproject.com/en/1.9/topics/i18n/translation/#localization-how-to-create-language-files)

  2. In diesen Fall entweder Zeilen django.po: msgid "Enter a valid email address." msgstr "Введите правильный адрес электронной почты." (oder eine andere Übersetzung Sie benötigen)

  3. Compilieren (django-admin compilemessages)

Verwandte Themen