Django ValueError:无法将字符串转换为float

时间:2017-03-17 18:37:33

标签: django django-models django-1.10

即使我把这一行放在我的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'

如此处所指定:https://docs.djangoproject.com/en/1.10/ref/settings/#decimal-separator

即使将L10N设置为False,它也无法识别(尽管语言代码应该已将小数点分隔符设置为逗号)

Django仍然不会将逗号识别为小数点分隔符

实际错误:

  

ValueError:无法将字符串转换为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_FORMAT都没有工作,它仍然期待默认值

2 个答案:

答案 0 :(得分:6)

问题是您似乎将模型字段与表单字段混淆。表单字段提供本地化,它可以工作:

>>> 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 :(得分:1)

这似乎是一个Django错误,并且有类似的报告here

但我很确定你可以通过使用表格来解决这个问题。我相信,当您尝试在管理员中更新FloatField值时,您会看到:' 123.123'这是因为该值保存在DB的数字字段中,不能支持','逗号。但您可以使用表单并定义表单字段,如下所示,以查看逗号:

your_field_name = forms.FloatField(localize=True)

localize=True它做了两件事;一个使用TextInput而不是NumberInput,并强制Django根据本地化设置格式化数字 - doc

但是,如果您不使用表单,解决此问题的唯一方法是在分配给模型字段之前清理数字,并且可以使用formats.sanitize_separators()中的django.utils函数:

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