Django forms.DecimalField.decimal_places属性の詳細解説
forms.DecimalField.decimal_places
は、Django フォームで小数点以下の桁数を制御するために使用される属性です。これは、小数点以下の桁数の最大数を指定し、フォームに入力された値を検証するために使用されます。
属性の詳細
- 必須: 否
- デフォルト値: None
- 型: 整数
使用方法
forms.DecimalField
を定義する際に、decimal_places
属性を指定します。
from django import forms
class MyForm(forms.Form):
price = forms.DecimalField(max_digits=5, decimal_places=2)
上記の例では、price
フィールドは最大5桁の数字を入力でき、小数点以下の桁数は最大2桁になります。
バリデーション
forms.DecimalField
は、入力された値が以下の条件を満たしていることを検証します。
- 最大桁数以下の数字であること
- 指定された桁数以下の小数点を含む有効な数字であること
例
以下の例は、forms.DecimalField
の動作を説明します。
from django import forms
class MyForm(forms.Form):
price = forms.DecimalField(max_digits=5, decimal_places=2)
form = MyForm(data={'price': '123.45'})
form.is_valid() # True
form = MyForm(data={'price': '12345.67'})
form.is_valid() # False
上記の例では、最初のフォームは有効ですが、2番目のフォームは無効です。2番目のフォームの値は最大桁数を超えているためです。
forms.DecimalField
は、小数点以下の桁数を自動的に丸めます。decimal_places
属性を指定しない場合は、None となり、小数点以下の桁数の制限はありません。decimal_places
属性は、max_digits
属性よりも小さい値である必要があります。
基本的な使用例
from django import forms
class ProductForm(forms.Form):
price = forms.DecimalField(max_digits=5, decimal_places=2)
quantity = forms.IntegerField()
このフォームを使用するには、次のコードのようにします。
data = {'price': 12.34, 'quantity': 10}
form = ProductForm(data)
if form.is_valid():
price = form.cleaned_data['price']
quantity = form.cleaned_data['quantity']
print(f"Price: {price}")
print(f"Quantity: {quantity}")
else:
print("Form is not valid")
このコードは次の出力を生成します。
Price: 12.34
Quantity: 10
カスタムバリデーション
この例では、forms.DecimalField
を使用して、小数点以下の桁数が1桁である必要があるフォームを作成します。
from django import forms
def validate_decimal_places(value):
if value.quantize(Decimal('1')) != value:
raise ValidationError('Decimal places must be 1')
class ProductForm(forms.Form):
price = forms.DecimalField(max_digits=5, decimal_places=2, validators=[validate_decimal_places])
quantity = forms.IntegerField()
data = {'price': 12.3, 'quantity': 10}
form = ProductForm(data)
if form.is_valid():
price = form.cleaned_data['price']
quantity = form.cleaned_data['quantity']
print(f"Price: {price}")
print(f"Quantity: {quantity}")
else:
print("Form is not valid")
Price: 12.3
Quantity: 10
この例では、forms.DecimalField
を使用して、初期値を設定したフォームを作成します。
from django import forms
class ProductForm(forms.Form):
price = forms.DecimalField(max_digits=5, decimal_places=2, initial=10.00)
quantity = forms.IntegerField()
data = {'price': '', 'quantity': 10}
form = ProductForm(data)
if form.is_valid():
price = form.cleaned_data['price']
quantity = form.cleaned_data['quantity']
print(f"Price: {price}")
print(f"Quantity: {quantity}")
else:
print("Form is not valid")
Price: 10.00
Quantity: 10
widget 属性
widget
属性を使用して、カスタムウィジェットを指定することができます。このウィジェットは、小数点以下の桁数を表示および入力する方法を制御することができます。
from django import forms
class MyForm(forms.Form):
price = forms.DecimalField(max_digits=5, decimal_places=2, widget=forms.NumberInput(attrs={'step': '0.01'}))
上記の例では、NumberInput
ウィジェットが使用されており、step
属性が 0.01
に設定されています。これは、ユーザーが0.01単位で値を入力できることを意味します。
localize 属性
localize
属性を True
に設定すると、Django は入力された値を現在のロケールに基づいてフォーマットします。これにより、ユーザーは小数点記号としてカンマを使用することができます。
from django import forms
class MyForm(forms.Form):
price = forms.DecimalField(max_digits=5, decimal_places=2, localize=True)
use_thousand_separators 属性
use_thousand_separators
属性を True
に設定すると、Django は大きな数字に千の位区切りを追加します。
from django import forms
class MyForm(forms.Form):
price = forms.DecimalField(max_digits=5, decimal_places=2, use_thousand_separators=True)