bbr*_*oke 1 python django django-templates django-forms
我有一个十进制字段,到达第四个位置,我想在我的模板中渲染到第二个位置(我需要它到第四个进行其他计算).我已经尝试使用模板浮点过滤器来缩短小数位,但结果是整个字段消失了.
我模型中的字段是:
price_retail = models.DecimalField(default=0, max_digits=9, decimal_places=4)
Run Code Online (Sandbox Code Playgroud)
我的表格是:
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)
Run Code Online (Sandbox Code Playgroud)
带FloatFilter的模板(字段根本不显示)
<td>{{form.price_retail|floatformat:2}}</td>
Run Code Online (Sandbox Code Playgroud)
没有FloatFilter的模板(字段显示但是到第4个小数)
我倾向于反馈和专业知识.
<td>{{form.price_retail}}</td>
Run Code Online (Sandbox Code Playgroud)
floatformat期望它的参数可以转换为Decimal实例,而不是表单字段. form.price_retail是一个表单字段实例(a DecimalField,具体).
DecimalField确实接受了一个decimal_places参数,但这是用于输入验证而不是舍入现有值.
我认为你需要quantize自己的价值 - 可能在表单的__init__方法中,或者可能在子类的字段类型甚至自定义小部件中 - 或者自己呈现输入元素,这样你就可以floatformat直接使用HTML 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
Run Code Online (Sandbox Code Playgroud)
您当然可以使用您喜欢的任何舍入策略,如量化所记录的那样.
我认为price_retail如果您在不编辑表单的情况下提交表单,这实际上不会更改该值,因为该字段似乎没有从其初始值更改.但我没有测试过.
| 归档时间: |
|
| 查看次数: |
2446 次 |
| 最近记录: |