对于FloatField,Django Model Form验证失败

时间:2015-01-27 09:55:50

标签: jquery python django

我有一个模型表格;有一个字段cost。我在该字段上使用jquery number,当值超过999时,它会附加逗号。 例如

Changes 1234 to 1,234

当用户提交表单时;数据未经过验证。 我尝试捕获Clean方法,但self.cleaned_data中不存在此值。 我还尝试从self.data中提取该值并将其转换为1234 float并附加到self.cleaned_data并返回。但那也没有用。

请让我知道。

Cost: Enter a number.

我缺少什么?

3 个答案:

答案 0 :(得分:1)

https://docs.djangoproject.com/en/1.7/topics/i18n/formatting/

首先,设置正确的区域设置:settings.USE_I18N,settings.USE_L10N,settings.LANGUAGE_CODE,settings.USE_THOUSAND_SEPARATOR

其次,将小部件设置为本地化:

class MyForm(forms.ModelForm):
       ...
       def __init__(self, *args, **kwargs):
           super(MyForm, self).__init__(*args, **kwargs)
           self.fields['cost'].localize = True
           self.fields['cost'].widget.is_localized = True

如果您使用的是forms.Form而不是modelform,那么您只需要将localize=True参数传递给字段定义

修改:虽然记录了FormField(localize=True),因此记录了form.fileds['fieldname'].localize = True,但未记录widget.is_localized,我已直接from django code。所以潜在的行为可能会在下一个django版本中出现,所以首选的方式是使用FormField(localize=True)

答案 1 :(得分:0)

Python无法转换" 1,234"字符串浮动。

>>> float("1,234")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 1,234
>>> 

您可以使用__init__方法形式清理此数据:

class MyForm(forms.Form):
    def __init__(self, data=None, *args, **kwargs)
        if data and 'cost' in data:
            data['cost'] = data['cost'].replace(',', '')
        super(MyForm, self).__init__(data, *args, **kwargs)

答案 2 :(得分:0)

您可以像这样覆盖默认字段:

class MyForm(forms.ModelForm):
    cost = forms.CharField()

    def clean_cost(self):
        data = self.cleaned_data['cost']
        return float(data.replace(',', ''))

    class Meta:
       model = MyModel
       field = {'cost', ...}

详细文档在此处:https://docs.djangoproject.com/en/1.7/topics/forms/modelforms/#overriding-the-default-fields