Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django ValueError:无法将字符串转换为浮点_Django_Django Models_Django 1.10 - Fatal编程技术网

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

Django ValueError:无法将字符串转换为浮点,django,django-models,django-1.10,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' 如此处所述: 即使L10N设置为False,它也无法识别(尽管语言代

即使我将这一行放在我的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,它也无法识别(尽管语言代码应该已经将十进制分隔符设置为逗号)

Django仍然无法将逗号识别为十进制分隔符

实际误差:

ValueError:无法将字符串转换为浮点:“123123”

该字段只是一个默认的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,字段为字符串


编辑:我刚刚检查了一下,甚至连输入的日期都没有格式化,它仍然需要默认值,这似乎是Django的错误,并且有类似的报道

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

your_field_name = forms.FloatField(localize=True)
通过说
localize=True
它可以做两件事;一种是使用TextInput而不是NumberInput,另一种是强制Django根据本地化设置格式化数字-

但如果您不使用表单,克服这一问题的唯一方法是在分配给模型字段之前对数字进行清理,您可以使用
格式。清理分隔符()
函数来自
django.utils

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."]
模型字段没有被记录为支持本地化,我在文档中看不到任何东西建议应该支持它

obj=model(**data.get('fields'))
表明您根本没有使用表单,您只是在使用JSON数据源并将其直接插入模型中。因此,我认为对您来说更好的选择是预处理JSON数据,因为Django似乎不支持您正在寻找的内容

您可能希望使用helper函数来清理数据。演示:

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

可能的原因是:请注意,如果USE_L10N设置为True,则区域设置指定的格式具有更高的优先级,将改为应用@nik_m已经试过了,但我的区域设置实际上应该将逗号定义为分隔符。你看到了吗?@JensAstrup这就是Django应该做的,它是十进制的,不是千位数。请你把代码发到错误的地方好吗?该死的,你是对的,我想模型和表单经常会混淆,这段时间我一直在看表单的字段源代码只是扩展了主题,如果我想对日期做同样的事情,正确的方法是
django.utils.dateparse
?我认为L10n版本似乎是date\u格式需要类似日期的对象并返回格式化的字符串,相反,找不到用于清理日期输入和本地化itOh的表单,对吗。
DateTimeField
(来自表单)使用自定义的
strtime
方法,使用解析的
self.input\u formats
中的第一种格式。