2017-03-17 8 views
3

浮かぶように文字列を変換できませんでした:ジャンゴとValueError:私は私のsettings.pyに次の行を入れていても

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' 

をここで指定したよう:L10NがFalseに設定されている場合でもhttps://docs.djangoproject.com/en/1.10/ref/settings/#decimal-separator

それはありません

ジャンゴ依然として小数点

実際ERとしてコンマを認識しないであろう(コンマなどの言語コードが既に設定されなければならないが小数点)を認識ror:

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

フィールドはデフォルトのFloatFieldであり、私はフォームを使用していません。

コンマを認識できない原因は何ですか?

この

はviews.pyコードです:

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() 

送信された要求は、文字列としてフィールドを持つだけでJSONで

編集:私はちょうどチェックし、それが機能していないにもDATE_INPUT_FORMATSは、それがありますまだデフォルト値

+0

本のかもしれない原因は:* USE_L10NがTrueに設定されている場合は、ロケールに決まる形式が高い優先順位を持ち、代わりに適用されることに注意してください*。? –

+0

@nik_mはすでにそれを試みましたが、私のロケール設定は実際にセパレータとしてコンマを定義する必要があります – Mojimi

+0

これを見たことがありますか?(http://stackoverflow.com/questions/1779288/how-do-i-use-python-to-コンマである場合はそれを第1のコンマで区切って変換する) –

答えて

3

問題はあなたですモデルフィールドをフォームフィールドと混同しているようです。フォームフィールドは、ローカリゼーションを提供し、それが動作します:

>>> 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 

モデルフィールドにはありません:

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

モデルフィールドはどこにもローカライズをサポートするように文書化されていない、と私は提案するsourceで何も見ることができませんそれはサポートされるべきだということです。

obj = model(**data.get('fields'))という行は、フォームをまったく使用していないことを示しています。JSONデータソースを消費して直接モデルにラミングするだけです。ですから、Djangoはあなたが探しているものをサポートしていないように見えるので、より良い選択肢はJSONデータを前処理することです。

that's what the forms.fields.FloatField usesはデータを消去するため、sanitize_separatorsヘルパー機能を使用することができます。デモ:

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

まあまあ、モデルやフォームは混乱する傾向があります。これはフォーム全体のフィールドソースコードを見ています。 – Mojimi

+0

同じトピックを展開していますが、 'django.utils.dateparse'ですか? – Mojimi

+0

私はL10nバージョンが['utils.formats.date_format']だと思った(https://github.com/django/django/blob/325db2a8c3453a56db5e0df0eed37476eb67802d/django/utils/formats.py#L148) – wim

1

これは、Djangoのバグが考えられますし、here

報告類似したものがある。しかし、私は」を期待フォームを使ってこれを克服することができます。私はあなたの管理者のFloatFieldの値を更新しようとすると '123.123'と表示されます。これは値が '、'カンマをサポートできないDBの数値フィールドに保持されているためです。代わりにコンマを参照するために、次のようにしかし、あなたはフォームを使用してフォームフィールドを定義することができます。それは2つのことを行いlocalize=Trueを言って

your_field_name = forms.FloatField(localize=True) 

を。 1つはNumberInputの代わりにTextInputを使用し、Djangoはローカライズ設定に基づいて数字を書式設定するように強制します - 。

しかし、あなたはフォームを使用しない場合は、これを克服する唯一の方法はあなたの前にフィールドをモデル化するために割り当てられた番号をサニタイズすることであり、あなたがdjango.utilsからformats.sanitize_separators()機能を使用することができます。

from django.utils import formats 
model.your_field_name = formats.sanitize_separators(value_from_user) 
model.save() 
関連する問題