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)