gpt4 book ai didi

python - 缩短ModelForm字段Django的小数位

转载 作者:太空宇宙 更新时间:2023-11-04 09:07:14 26 4
gpt4 key购买 nike

我有一个小数字段到第 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 的模板(字段显示到小数点后第四位)

我感谢反馈和专业知识。

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

最佳答案

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

DecimalField 确实接受 decimal_places参数,但这是用于输入验证而不是现有值的舍入。

我认为您需要 quantize您自己的值 - 可能在表单的 __init__ 方法中,或者可能在子类字段类型甚至自定义小部件中 - 或者自己呈现输入元素,以便您可以直接使用 floatformat在 HTML inputvalue 属性上。我认为最简单的方法是在 __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 值,因为该字段看起来与其初始值相比没有变化。但我还没有测试过。

关于python - 缩短ModelForm字段Django的小数位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19237807/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com