将django表单(formset)中的十进制数加载到数字输入中

时间:2017-04-04 18:14:59

标签: jquery python django forms validation

我正在创建一个简单的django应用程序,您可以使用成分创建食谱。在我的RecipeCreate视图中,我有一个带有select输入的简单formset(您选择产品的地方)和带有产品计数的input type="number"。所以我的形式和模型很简单:

class Ingredient(models.Model):
    product = models.ForeignKey(Product)
    count = models.DecimalField(max_digits=4, decimal_places=2)

class IngredientForm(forms.ModelForm):
    class Meta:
        model = Ingredient
        fields = ('product', 'count') 

现在,当我想在我的RecipeEdit视图中显示我的食谱时,除count输入外,所有内容都正常。我得到以下jQuery验证错误:

The specified value "12,00" is not a valid number. The value 
must match to the following regular expression: -?(\d+|\d+\.\d+|\.\d+)([eE][-+]?\d+)?

因为我正在写一个波兰语网站,我想要我们的国家标准小数点分隔符,它是,而不是.(但点也应该是分隔符)。

其中一个解决方案是使用input type="text",但这意味着我必须手动验证我的号码,这很麻烦。 有没有办法传递我的号码12,00,以便输入字段接受它。可能更改/覆盖标准的jQuery验证?但我会接受任何好的建议解决方案。

另一个奇怪的事实是,当我手动编写12,0012.00并提交表单时,我的表单有效且我的Ingredient计数字段的值为12,这就是我欲望。这是input type="number"的另一个专业人士。

4 个答案:

答案 0 :(得分:1)

您可以设置您的区域设置decimal separator

更新:

没有看到它与jquery相关,

您可以为例如

的逗号编号创建新的验证程序类
jQuery.validator.addMethod("commanumber", function (value, element) {
    return this.optional(element) || /^(\d+|\d+,\d{1,2})$/.test(value);
}, "Please specify the correct number format");

甚至扩展正则表达式以支持。还

答案 1 :(得分:1)

好的,我做过这样的事情。首先,我使用的是输入类型=" text"。然后使用jQuery.numeric()我转换输入,使其仅接受数字,并将,作为小数分隔符。

$("#field_id").numeric({ decimal : "," });

现在,每次我提交表单时,我都会有一些代码将,转换为.,以便符合后端逻辑:

$('#recipe-form').on('submit', function(){
    $('.convert-separator').each(function () {
        $(this).val($(this).val().replace(',','.'));
    });
    this.submit();
});

但我认为这不是最好的解决方案。我认为必须有input type="number"字段与,分隔符一起使用。

答案 2 :(得分:0)

您可以转换jQuery代码中的计数值:

dotCount = count.toString().replace(',', '.');

用点

替换逗号

答案 3 :(得分:0)

我找到nice article哪个人可以描述你的问题。作者建议使用lang属性,例如<html lang="en-150"><input type="number" lang="en-150">

note

上还有一个www.w3.org
  

4.10.5.2关于表单控件本地化的实施说明

     

本节不具备规范性。

     

在日期,时间和数字控件中向用户显示的格式为   独立于表单提交的格式。

     

鼓励浏览器使用显示日期的用户界面,   时间和数字根据区域设置的约定   由input元素的语言或用户首选所暗示   语言环境。使用页面的区域设置将确保与   页面提供的数据。

     
    

例如,如果是美国英语,则会让用户感到困惑     页面声称Cirque De Soleil节目即将播出     02/03,但他们的浏览器,配置为使用英国英语     区域设置,仅在购票日期选择器中显示日期03/02。     使用页面的语言环境至少可以确保日期为     到处都以相同的格式呈现。 (还有风险     当然,用户最迟会迟到一个月,但是有     关于这种文化差异可以做的很多......)