我有一个十进制字段,第四个位置,我想在我的模板中渲染到第二位(我需要它到第四位进行其他计算)。我尝试使用模板浮点过滤器来缩短小数位,但结果是整个字段消失了。
我的模型中的字段是:
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>
答案 0 :(得分:5)
floatformat
期望它的参数可以转换为Decimal
实例,而不是表单字段。 form.price_retail
是一个表单字段实例(DecimalField
,具体而言)。
DecimalField
确实接受decimal_places
参数,但这是用于输入验证而不是现有值的舍入。
我认为您需要自己quantize
值 - 可能是表单的__init__
方法,或者可能是子类字段类型甚至自定义小部件 - 或者自己呈现输入元素因此,您可以直接在HTML floatformat
的{{1}}属性上使用input
。我认为最简单的方法是在value
中进行,类似这样:
__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
值,因为该字段似乎没有从其初始值更改。但我没有测试过。
答案 1 :(得分:0)
您只需在实际表单字段中设置小数位:
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