我正在尝试执行以下操作:
class AmountInfoForm(forms.ModelForm):
amount = forms.IntegerField()
class Meta:
model = Customer
fields = ('amount',)
对于我的模型字段:
class Customer(models.Model):
amount = models.DecimalField(max_digits=6, decimal_places=2, null=True)
这样我的文本输入中显示的值是圆的,而不是显示小数位。
问题是小数位仍然显示。
它仅接受数字60
作为输入值。但是,当它显示字段的表单实例时,它会显示60.00
我做错了什么?
答案 0 :(得分:2)
1) Django字段不是Django小部件,DecimalField
和IntegerField
的默认小部件是TextInput
。
从this note开始,您的声明会覆盖amount
字段的默认行为。但是存储在Decimal
中的数据不是int
,所以如果你想在int
中代表它,你应该这样做:
int(Decimal())
或阅读Decimal docs
并设置自定义舍入。
2)在此步骤中,您需要使用smth来指定自定义渲染,因此有多少变化可以执行此操作(此时我记得其中两个):
2.1)简单的 - 覆盖ModelForm init中的初始数据:
class AmountInfoForm(forms.ModelForm):
class Meta:
model = Customer
fields = ('amount',)
def __init__(self, *args, **kwargs):
super(AmountInfoForm, self).__init__(*args, **kwargs)
amount_initial = self.initial.get('amount')
if amount_initial:
self.initial['amount'] = int(amount_initial)
2.2)如果您需要在精美小部件中使用自定义表示,则可以覆盖TextInput
(look at the source)并在class Meta
docs中指定它:
class YourCustomWidget(TextInput):
def render(self, name, value, attrs=None):
if value is None:
value = ''
final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
if value != '':
# Only add the 'value' attribute if a value is non-empty.
custom_value = int(value)
final_attrs['value'] = force_text(self._format_value(custom_value))
# here you can customise output html
return format_html('<input{0} />', flatatt(final_attrs))
class AmountInfoForm(forms.ModelForm):
class Meta:
model = Customer
fields = ('amount',)
widgets = {
'amount': YourCustomWidget(),
}