如何在django模型中为DecimalField创建一个IntegerField?

时间:2014-11-05 18:40:10

标签: django django-models django-forms

我正在尝试执行以下操作:

class AmountInfoForm(forms.ModelForm):

    amount = forms.IntegerField()

    class Meta:
        model = Customer
        fields = ('amount',)

对于我的模型字段:

class Customer(models.Model):
    amount = models.DecimalField(max_digits=6, decimal_places=2, null=True)

这样我的文本输入中显示的值是圆的,而不是显示小数位。

问题是小数位仍然显示。

它仅接受数字60作为输入值。但是,当它显示字段的表单实例时,它会显示60.00 我做错了什么?

1 个答案:

答案 0 :(得分:2)

1) Django字段不是Django小部件,DecimalFieldIntegerField的默认小部件是TextInput

this note开始,您的声明会覆盖amount字段的默认行为。但是存储在Decimal中的数据不是int,所以如果你想在int中代表它,你应该这样做:

int(Decimal())

或阅读Decimal docs并设置自定义舍入。

2)在此步骤中,您需要使用smth来指定自定义渲染,因此有多少变化可以执行此操作(此时我记得其中两个):

2.1)简单的 - 覆盖ModelForm init中的初始数据:

class AmountInfoForm(forms.ModelForm):
    class Meta:
        model = Customer
        fields = ('amount',)

    def __init__(self, *args, **kwargs):
        super(AmountInfoForm, self).__init__(*args, **kwargs)

        amount_initial = self.initial.get('amount')
        if amount_initial:
            self.initial['amount'] = int(amount_initial)

2.2)如果您需要在精美小部件中使用自定义表示,则可以覆盖TextInputlook at the source)并在class Meta docs中指定它:

class YourCustomWidget(TextInput):
    def render(self, name, value, attrs=None):
        if value is None:
            value = ''
        final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
        if value != '':
            # Only add the 'value' attribute if a value is non-empty.
            custom_value = int(value)
            final_attrs['value'] = force_text(self._format_value(custom_value))

        # here you can customise output html
        return format_html('<input{0} />', flatatt(final_attrs))

class AmountInfoForm(forms.ModelForm):
    class Meta:
        model = Customer
        fields = ('amount',)
        widgets = {
            'amount': YourCustomWidget(),
        }