Django ValueError: could not convert string to float
Django ValueError: could not convert string to float
即使我将这一行放在我的 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: 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 都没有工作,它仍然需要默认值
这似乎是一个 Django 错误,并且有类似的报道here
但我很确定您可以通过使用表单来克服这个问题。我相信,当您尝试在管理员中更新 FloatField 值时,您会看到:“123.123”,这是因为该值保存在不支持“,”逗号的数据库数字字段中。但是您可以使用表单并按如下方式定义表单字段以查看逗号:
your_field_name = forms.FloatField(localize=True)
通过说 localize=True
它做了两件事;一种是使用 TextInput 而不是 NumberInput 并强制 Django 根据本地化设置格式化数字 - doc.
但是如果你不使用表格,解决这个问题的唯一方法是在分配给模型字段之前对你的数字进行清理,你可以使用 django.utils
中的 formats.sanitize_separators()
函数:
from django.utils import formats
model.your_field_name = formats.sanitize_separators(value_from_user)
model.save()
问题是您似乎混淆了模型字段和表单字段。表单字段提供本地化,并且有效:
>>> 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
helper function, since that's what the forms.fields.FloatField
uses 来清理数据。演示:
>>> from django.utils.formats import sanitize_separators
>>> sanitize_separators('123,123')
'123.123'
即使我将这一行放在我的 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: 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 都没有工作,它仍然需要默认值
这似乎是一个 Django 错误,并且有类似的报道here
但我很确定您可以通过使用表单来克服这个问题。我相信,当您尝试在管理员中更新 FloatField 值时,您会看到:“123.123”,这是因为该值保存在不支持“,”逗号的数据库数字字段中。但是您可以使用表单并按如下方式定义表单字段以查看逗号:
your_field_name = forms.FloatField(localize=True)
通过说 localize=True
它做了两件事;一种是使用 TextInput 而不是 NumberInput 并强制 Django 根据本地化设置格式化数字 - doc.
但是如果你不使用表格,解决这个问题的唯一方法是在分配给模型字段之前对你的数字进行清理,你可以使用 django.utils
中的 formats.sanitize_separators()
函数:
from django.utils import formats
model.your_field_name = formats.sanitize_separators(value_from_user)
model.save()
问题是您似乎混淆了模型字段和表单字段。表单字段提供本地化,并且有效:
>>> 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
helper function, since that's what the forms.fields.FloatField
uses 来清理数据。演示:
>>> from django.utils.formats import sanitize_separators
>>> sanitize_separators('123,123')
'123.123'