DecimalField

Поле DecimalField применяется в классах форм для обработки десятичных чисел, таких как цены, проценты или координаты. При получении данных из запроса поле выполняет валидацию, проверяет количество цифр до и после запятой, а затем преобразует строку в объект Decimal. Это поле особенно полезно для финансовых расчётов, где важна точность.

Синтаксис

pythonfield = forms.DecimalField(
  max_digits=None,
  decimal_places=None,
  max_value=None,
  min_value=None,
  **kwargs
)

Параметры DecimalField:

Остальные параметры наследуются от Field: required, label, initial, help_text, error_messages, disabled.

Пример

Создадим форму для ввода цены товара с двумя знаками после запятой:

pythonfrom django import forms

class ProductForm(forms.Form):
  name = forms.CharField(max_length=100)
  price = forms.DecimalField(
    max_digits=10,
    decimal_places=2,
    label="Price",
    help_text="Enter price with two decimal places"
  )

При отправке формы с корректным значением поле преобразует строку в Decimal:

pythonfrom django import forms
from decimal import Decimal

class ProductForm(forms.Form):
  price = forms.DecimalField(max_digits=10, decimal_places=2)

form = ProductForm({'price': '19.99'})
if form.is_valid():
  res = form.cleaned_data['price']
  print(type(res))
  print(res)

Результат выполнения кода:

python"<class 'decimal.Decimal'>"
"19.99"

Пример

Добавим ограничения на минимальное и максимальное значение для поля рейтинга:

pythonfrom django import forms
from decimal import Decimal

class ReviewForm(forms.Form):
  rating = forms.DecimalField(
    max_digits=3,
    decimal_places=1,
    min_value=Decimal('0.0'),
    max_value=Decimal('5.0'),
    label="Rating"
  )
  comment = forms.CharField(widget=forms.Textarea)

form = ReviewForm({'rating': '4.5', 'comment': 'Good product'})
if form.is_valid():
  print(form.cleaned_data['rating'])

Результат выполнения кода:

python"4.5"

Пример

Попробуем отправить некорректное значение с большим количеством знаков после запятой:

pythonfrom django import forms

class ProductForm(forms.Form):
  price = forms.DecimalField(max_digits=5, decimal_places=2)

form = ProductForm({'price': '123.456'})
if not form.is_valid():
  print(form.errors['price'])

Результат выполнения кода:

python"['Ensure that there are no more than 2 decimal places.']"

Пример

Используем DecimalField в форме на основе модели с полем DecimalField:

pythonfrom django.db import models
from django import forms

class Product(models.Model):
  name = models.CharField(max_length=100)
  price = models.DecimalField(max_digits=10, decimal_places=2)

class ProductForm(forms.ModelForm):
  class Meta:
    model = Product
    fields = ['name', 'price']

form = ProductForm({'name': 'Smartphone', 'price': '999.99'})
if form.is_valid():
  product = form.save()
  print(product.price)

Результат выполнения кода:

python"999.99"

Смотрите также

  • поле FloatField,
    которое принимает числа с плавающей точкой
  • поле IntegerField,
    которое принимает целые числа
  • валидатор DecimalValidator,
    который проверяет количество цифр в числе
  • валидаторы MaxValueValidator и MinValueValidator,
    которые ограничивают диапазон значений