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

Posted

技术标签:

【中文标题】将 django 表单(formset)中的十进制数加载到数字输入中【英文标题】:Loading decimal numbers from django form (formset) into number input 【发布时间】:2017-08-30 02:15:57 【问题描述】:

我正在创建一个简单的 django 应用程序,您可以在其中创建包含配料的食谱。在我的RecipeCreate 视图中,我有一个简单的表单集,其中包含select 输入(您可以在其中选择产品)和带有产品计数的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 计数字段的值是 od 12,这是我想要的。这是input type="number" 的另一个专业人士。

【问题讨论】:

【参考方案1】:

你可以设置你的语言环境decimal separator

更新:

没看出是jquery相关的,

例如,您可以为逗号数字创建新的验证器类

jQuery.validator.addMethod("commanumber", function (value, element) 
    return this.optional(element) || /^(\d+|\d+,\d1,2)$/.test(value);
, "Please specify the correct number format");

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

【讨论】:

我使用的是USE_L10N,因此我的小数分隔符是,,就像我的问题中提到的那样。如果我将小数点分隔符设置为.,我确实不会收到警告消息。但即使在document.ready 之后,我仍然无法将小数点分隔符更改为,,因为type="number" 不允许这样做。 你使用的语言标签(LANGUAGE_CODE)是什么 LANGUAGE_CODE = 'pl' 我真的很喜欢这个带有自定义验证器的选项。你能告诉我如何使用它吗?是否可以在 input type="number" 字段上使用它,以便它覆盖标准验证? 扩展正则表达式的部分也是我正在考虑的一种方式,但尽管我一直在我的jquery.min.js 文件中更改我的正则表达式,但在我的浏览器中没有看到。我使用的是CTRL+F5,但我不知道为什么我的浏览器总是看到带有旧正则表达式的旧文件。当更改jquery.min.js PyCharm 告诉我:Generated source files should not be edited. The changes will be lost when sources are regenerated 所以我放弃了这个。也许你知道如何避免这个问题?【参考方案2】:

好的,我做过类似的事情。首先,我使用输入类型 =“文本”。然后使用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" 字段与, 分隔符一起使用。

【讨论】:

【参考方案3】:

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

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

这用点替换逗号

【讨论】:

当然,但这仍然意味着我首先在控制台中收到警告,然后我输入了一个带有. 作为分隔符的数字。我想将, 作为标准的初始分隔符,但它也应该接受.【参考方案4】:

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

www.w3.org上还有一个note

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

本节是非规范性的。

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

鼓励浏览器使用显示日期的用户界面, 时间和数字根据任一语言环境的约定 由输入元素的语言或用户的偏好所暗示 语言环境。使用页面的语言环境将确保与 页面提供的数据。

例如,如果使用美式英语,用户会感到困惑 页面声称太阳马戏团的节目将在 02/03,但他们的浏览器,配置为使用英式英语 语言环境,仅在购票日期选择器中显示日期 03/02。 使用页面的语言环境至少可以确保日期是 到处都以相同的格式呈现。 (仍然存在风险 当然,用户最终会晚一个月到达,但是有 对于这种文化差异,只能做这么多……)

【讨论】:

看起来还不错,但问题出在 jQuery 验证中。真的不行。

以上是关于将 django 表单(formset)中的十进制数加载到数字输入中的主要内容,如果未能解决你的问题,请参考以下文章

Django Formset 中的自定义标签

angular.js 中的 Django formset 等效项

使用 clean 更改 Django formset 中的字段

Django之路——form modelform formset modelformset的各种用法

从 django formset 中删除表单

使用 formset / managment_form 变量时,提交的 Django 表单没有 POST 数据