2017-03-17 134 views
3

即使我把這個線在我的settings.py:Django的ValueError異常:無法將字符串轉換爲浮動

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' 

,那麼具體:https://docs.djangoproject.com/en/1.10/ref/settings/#decimal-separator

即使本地化設置爲False也不會承認(雖然語言代碼應該已經設置小數點分隔符爲逗號)

Django的仍然將無法識別逗號作爲小數點分隔符

實際呃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-轉換-A-字符串到一個號碼,如果-IT-具有-逗號,在-IT-AS-TH)? –

回答

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數據源並直接在模型中進行壓縮。所以,我認爲更好的選擇是預先處理JSON數據,因爲Django似乎不支持你要找的東西。

您可能會喜歡使用sanitize_separators輔助函數,因爲that's what the forms.fields.FloatField uses要清除數據。演示:

>>> 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的bug和有類似報道here

但我很確定你可以通過使用表單來克服這個問題。我相信,當您嘗試更新管理員中的FloatField值時,您會看到:'123.123',這是因爲該值保存在數據庫的數字字段中,該字段不支持','逗號。但是你可以使用的形式和定義表單字段如下看逗號,而不是:

your_field_name = forms.FloatField(localize=True) 

按說localize=True它做兩件事情;一個使用TextInput而不是NumberInput,並強制Django根據本地化設置來格式化數字 - 。

但是,如果你不使用的形式,來克服這個問題的唯一辦法就是清理你分配模型前場號碼,您可以使用formats.sanitize_separators()功能從django.utils

from django.utils import formats 
model.your_field_name = formats.sanitize_separators(value_from_user) 
model.save() 
相關問題