简化模型表单字段Django的小数位数

2024-06-16 10:30:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的模型中的字段是:

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

我的表格是:

^{pr2}$

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

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

不带FloatFilter的模板(字段显示但精确到小数点后4位)

我很重视反馈和专业知识。在

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

Tags: 模型form模板default过滤器modelspricemax
2条回答

您只需设置实际表单字段的小数位数:

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

floatformat希望其参数是可以转换为Decimal实例的内容,而不是表单字段。form.price_retail是一个表单域实例(具体来说是DecimalField)。在

DecimalField确实接受^{}参数,但这是为了输入验证,而不是对现有值进行舍入。在

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

相关问题 更多 >