【问题标题】:Pass decimal value to django model from formated input从格式化输入将十进制值传递给 django 模型
【发布时间】:2018-01-02 07:49:55
【问题描述】:

我在 Django 模型和表单中有一个 DecimalField,同样我有一个 html 表单输入,逗号作为千位分隔符,点作为小数分隔符 (123,456.78),使用 jquery 插件Cleave.js 格式化,但是当我,尝试保存我的表单,这会显示一条消息:输入一个数字。

我想保存表单中的数据,以十进制值表示,而不会丢失 html 中的格式。

对不起!我的英语太差了。

这是我的代码:

型号

class Product(models.Model):
    Price = models.DecimalField(
        max_digits=17,
        decimal_places=2,
        default=0.00,
        validators=[
            MinValueValidator(
                100.00,
                message='>=100')])

表格

class ProductForm(forms.ModelForm):
    price = forms.DecimalField(
        label='Price',
        label_suffix=False,
        max_digits=17,
        decimal_places=2,
        widget=forms.TextInput(
            attrs={'placeholder': '123,456.78'})
        )

    class Meta:
        model = Product
        fields = [
            'price'
        ]       

查看

class NewProduct(CreateView):
    model = Product
    form_class = ProductForm
    template_name = 'new_product.html'

    def get_success_url(self):
        return reverse('products:new')

    def get_queryset(self):
        products = Product.objects.all()
        return products

    def get_context_data(self, **kwargs):
        context = super(NewProduct, self).get_context_data(**kwargs)
        context['products'] = self.get_queryset()
        return context

HTML

<html lang="es">
    <head>      
        <script src="{% static 'js/cleave.js' %}" type="text/javascript"></script>
    </head>

    <body>
        <input type="text" id="price" class="price">

        <script>
            new Cleave('.price', {
                numeral: true,
                numeralDecimalMark: '.',
                delimiter: ','
            });
        </script>
    </body>
</html>

【问题讨论】:

  • 你的视野里有什么?
  • 我,添加视图

标签: jquery html django


【解决方案1】:

好吧,我解决了这个问题,继承 DecimalField 类,不松散原始行为,并创建一个名为 Thousands 的新类(基于 DecimalField 类),用于覆盖 to_python 函数并用空字符串替换逗号 ''。

这是我的代码。

这对我有用,如果有人可以写一个更好的方法并在这里发布,那么我将非常感激。

再次,我的英语太糟糕了,对不起!。

型号

class Product(models.Model):
    Price = models.DecimalField(
        max_digits=17,
        decimal_places=2,
        default=0.00,
        validators=[
            MinValueValidator(
                100.00,
                message='>=100')])

表格

from decimal import Decimal, DecimalException

class Thousands(forms.DecimalField):
    def to_python(self, value):
        if value in self.empty_values:
            return None
        if self.localize:
            value = formats.sanitize_separators(value)
        value = force_text(value).strip().replace(',', '')

        try:
            value = Decimal(value)
        except DecimalException:
            raise ValidationError(self.error_messages['invalid'], code='invalid')
        return value


class ProductForm(forms.ModelForm):
    price = Thousands(
        label='Price',
        label_suffix=False,
        max_digits=17,
        decimal_places=2,
        widget=forms.TextInput(
            attrs={'placeholder': '123,456.78'})
        )

    class Meta:
        model = Product
        fields = [
            'price'
        ]       

查看

class NewProduct(CreateView):
    model = Product
    form_class = ProductForm
    template_name = 'new_product.html'

    def get_success_url(self):
        return reverse('products:new')

    def get_queryset(self):
        products = Product.objects.all()
        return products

    def get_context_data(self, **kwargs):
        context = super(NewProduct, self).get_context_data(**kwargs)
        context['products'] = self.get_queryset()
        return context

HTML

<html lang="es">
    <head>      
        <script src="{% static 'js/cleave.js' %}" type="text/javascript"></script>
    </head>

    <body>
        <form action="." method="post">
            {% csrf_token %}

            {{ form }}
        </form>

        <script>
            new Cleave('.price', {
                numeral: true,
                numeralDecimalMark: '.',
                delimiter: ','
            });
        </script>
    </body>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2012-10-26
    • 2023-03-12
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多