DecimalField
Поле DecimalField применяется в классах форм для обработки десятичных чисел, таких как цены, проценты или координаты. При получении данных из запроса поле выполняет валидацию, проверяет количество цифр до и после запятой, а затем преобразует строку в объект Decimal. Это поле особенно полезно для финансовых расчётов, где важна точность.
Синтаксис
field = forms.DecimalField(
max_digits=None,
decimal_places=None,
max_value=None,
min_value=None,
**kwargs
)
Параметры DecimalField:
max_digits- общее максимальное количество цифр (включая цифры после запятой). Обязательный параметр, если не указанdecimal_places.decimal_places- количество знаков после запятой. Обязательный параметр, если не указанmax_digits.max_value- максимальное допустимое значение (типDecimalили число).min_value- минимальное допустимое значение (типDecimalили число).
Остальные параметры наследуются от Field: required, label, initial, help_text, error_messages, disabled.
Пример
Создадим форму для ввода цены товара с двумя знаками после запятой:
from 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:
from 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)
Результат выполнения кода:
"<class 'decimal.Decimal'>"
"19.99"
Пример
Добавим ограничения на минимальное и максимальное значение для поля рейтинга:
from 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'])
Результат выполнения кода:
"4.5"
Пример
Попробуем отправить некорректное значение с большим количеством знаков после запятой:
from 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'])
Результат выполнения кода:
"['Ensure that there are no more than 2 decimal places.']"
Пример
Используем DecimalField в форме на основе модели с полем DecimalField:
from 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)
Результат выполнения кода:
"999.99"
Смотрите также
-
поле
FloatField,
которое принимает числа с плавающей точкой -
поле
IntegerField,
которое принимает целые числа -
валидатор
DecimalValidator,
который проверяет количество цифр в числе -
валидаторы
MaxValueValidatorиMinValueValidator,
которые ограничивают диапазон значений