1

我有一个小数字段到第 4 位,我想在我的模板中渲染到第 2 位(我需要它到第 4 位进行其他计算)。我尝试使用模板浮点过滤器来缩短小数位,但结果是整个字段都消失了。

我模型中的字段是:

price_retail = models.DecimalField(default=0, max_digits=9, decimal_places=4)

我的表格是:

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['price_retail']

    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs) 
        self.fields['price_retail'].widget.attrs['class'] = 'input-price'

ProductFormSet = modelformset_factory(Product, form=ProductForm, extra=0)

带有 FloatFilter 的模板(字段根本不显示)

<td>{{form.price_retail|floatformat:2}}</td>

没有 FloatFilter 的模板(字段显示但到小数点后 4 位)

我很欣赏反馈和专业知识。

<td>{{form.price_retail}}</td>
4

2 回答 2

6

floatformat期望它的参数是可以转换为Decimal实例的东西,而不是表单字段。 form.price_retail是一个表单域实例(DecimalField具体来说是一个)。

DecimalField确实接受一个decimal_places参数,但这是用于输入验证而不是对现有值进行四舍五入。

我认为您需要quantize自己的值 - 可能在表单的__init__方法中,或者可能在子类字段类型甚至自定义小部件中 - 或者自己呈现输入元素,以便您可以floatformat直接在 HTMLinputvalue属性上使用。我认为最简单的方法是在 中进行__init__,如下所示:

class ProductForm(forms.ModelForm):
    # Meta as above
    def __init__(self, *args, **kwargs):
        if 'instance' in kwargs:
            kwargs['instance'].price_retail = kwargs['instance'].price_retail.quantize(Decimal('0.01'))
        super(ProductForm, self).__init__(*args, **kwargs) 
        self.fields['price_retail'].widget.attrs['class'] = 'input-price'
        self.fields['price_retail'].decimal_places = 2

您当然可以使用您喜欢的任何舍入策略,如量化所记录的那样。

认为如果您提交表单而不编辑它,这实际上不会改变price_retail值,因为该字段似乎没有从它的初始值改变。但我没有测试过。

于 2013-10-08T02:34:54.997 回答
1

您可以在实际表单字段中设置小数位:

def __init__(self, *args, **kwargs):
    super(ProductForm, self).__init__(*args, **kwargs) 
    self.fields['price_retail'].widget.attrs['class'] = 'input-price'
    self.fields['price_retail'].decimal_places = 2
于 2013-10-08T02:34:12.963 回答