2017-03-17 3 views
3

Selbst zu schweben, obwohl ich diese Zeile in meinem settings.py setzen:Django Valueerror: konnte nicht Zeichenfolge konvertieren

LANGUAGE_CODE = 'pt-br' 

TIME_ZONE = 'America/Sao_Paulo' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 

DECIMAL_SEPARATOR = ',' 

DATE_INPUT_FORMATS = ['%d/%m/%Y'] 

DATE_FORMAT = r'd/m/Y' 

Wie hier angegeben: https://docs.djangoproject.com/en/1.10/ref/settings/#decimal-separator

Selbst mit L10N auf False festgelegt wird es nicht erkennen (obwohl sollte der Sprachcode bereits eingestellt Dezimaltrennzeichen als Komma)

noch Django wird das Komma als Dezimalzeichen

Actual er nicht erkennen ror:

ValueError: could not convert string to float: '123,123'

Das Feld ist nur ein Standard-FloatField, ich verwende keine Formulare.

Was könnte dazu führen, dass das Komma nicht erkannt wird?

Dies ist der views.py Code:

def new_object(request): 
    data = json.loads(request.body.decode("utf-8")) 
    model_name = data.get('model') 
    model = apps.get_model(app_label='cadastroimoveis', model_name=model_name) 
    obj = model(**data.get('fields')) 
    obj.save() 

Die gesendete Anforderung ist nur ein JSON mit den Feldern als Strings

Edit: Ich habe gerade überprüft und nicht einmal die DATE_INPUT_FORMATS es funktioniert, ist es noch erwarten die Standardwerte

+0

Vielleicht dies verursachen:. * Beachten Sie, dass, wenn USE_L10N auf True gesetzt ist, dann ist die locale-diktierte Format eine höhere Priorität hat und stattdessen angewendet werden *? –

+0

@nik_m versuchte das bereits, aber meine Gebietsschema-Einstellungen sollten eigentlich Komma als Trennzeichen definieren – Mojimi

+0

Habe dies gesehen [diese Frage] (http://stackoverflow.com/questions/1779288/how-doi-i-use-python-to- convert-a-string-zu-Nummer-wenn-es-hat-Kommas-in-es-als-th)? –

Antwort

3

Das Problem ist, dass Sie scheinen Modellfelder mit Formularfeldern zu verwirren. Das Formularfeld bietet Lokalisierung, und es funktioniert:

>>> from django.db.models.fields import FloatField 
>>> from django.forms.fields import FloatField as FloatFormField 
>>> model_field = FloatField() 
>>> form_field = model_field.formfield(localize=True) 
>>> isinstance(form_field, FloatFormField) 
True 
>>> form_field.to_python('123,123') 
123.123 

Das Modellfeld nicht:

>>> model_field.to_python('123,123') 
ValidationError: [u"'123,123' value must be a float."] 

Das Modellfeld als unterstützende Lokalisierung nirgends dokumentiert ist, und ich kann nichts in den source sehen vorschlagen dass es unterstützt werden soll.

Die Zeile obj = model(**data.get('fields')) zeigt, dass Sie überhaupt keine Formulare verwenden, Sie verbrauchen nur eine JSON-Datenquelle und rammen diese direkt in das Modell. Also, ich denke, die bessere Option für Sie ist die Vorverarbeitung der JSON-Daten, da Django nicht das zu unterstützen scheint, wonach Sie suchen.

Sie könnten gerne sanitize_separators Hilfsfunktion, seit that's what the forms.fields.FloatField uses, um die Daten zu reinigen. Demo:

>>> from django.utils.formats import sanitize_separators 
>>> sanitize_separators('123,123') 
'123.123' 
+1

Verdammt, du hast Recht, Modelle und Formen neigen dazu, viel verwirrt zu werden, denke ich, diese ganze Zeit sah ich Form Feld Quellcode – Mojimi

+0

Nur erweitern auf das Thema, Wenn ich das gleiche mit Daten, die richtige Methode machen möchte ist 'django.utils.dateparse'? – Mojimi

+0

Ich dachte, die L10n Version zu sein scheint [ 'utils.formats.date_format'] (https://github.com/django/django/blob/325db2a8c3453a56db5e0df0eed37476eb67802d/django/utils/formats.py#L148) – wim

1

Dies scheint ein Django Fehler und es ist etwas ähnliches berichtete here

Aber ich Ich bin mir ziemlich sicher, dass Sie das durch die Verwendung von Formularen überwinden können. Ich glaube, wenn Sie versuchen, diesen FloatField-Wert in Ihrem Admin zu aktualisieren, sehen Sie: "123.123", und das liegt daran, dass der Wert im numerischen Feld der DB bleibt, das Komma nicht unterstützen kann. Aber Sie können Formulare und Formularfeld definieren als durch Komma sehen folgt statt:

your_field_name = forms.FloatField(localize=True) 

Indem man sagt, localize=True es tut 2 Dinge; ein, um TextInput anstelle von NumberInput zu verwenden und Django zu zwingen, die Zahl basierend auf den Einstellungen für die Lokalisierung zu formatieren - .

Aber wenn Sie keine Formulare verwenden, die einzige Möglichkeit, dies zu überwinden, ist es, Ihnen Zahlen zu sanieren, bevor Feld zu modellieren zugewiesen, und Sie formats.sanitize_separators() Funktion von django.utils verwenden:

from django.utils import formats 
model.your_field_name = formats.sanitize_separators(value_from_user) 
model.save() 
Verwandte Themen