StepValueValidator

Валидатор StepValueValidator применяется к полям формы для проверки, что введенное значение делится на заданный шаг без остатка. Он принимает два аргумента: обязательный step - размер шага, и необязательный offset - смещение, которое определяет начальную точку отсчета. Валидатор автоматически используется полями форм на основе моделей, если в модели для числового поля задан параметр step. В случае ошибки валидации генерируется исключение ValidationError с соответствующим сообщением.

Синтаксис

pythonfrom django.core.validators import StepValueValidator

validator = StepValueValidator(step, offset=None)

Параметры валидатора:

Пример . С полем формы

Создадим форму с числовым полем, которое принимает только значения, кратные 5:

pythonfrom django import forms
from django.core.validators import StepValueValidator

class ProductForm(forms.Form):
  quantity = forms.IntegerField(
    validators=[StepValueValidator(5)],
    label="Quantity"
  )

Если пользователь введет значение 12, которое не кратно 5, валидация вернет ошибку. Правильными значениями будут 5, 10, 15 и так далее.

Пример . С offset

Используем смещение для проверки значений, которые должны быть кратны шагу, начиная с определенного числа. Например, допустимые значения: 2, 7, 12:

pythonfrom django import forms
from django.core.validators import StepValueValidator

class PricingForm(forms.Form):
  price = forms.IntegerField(
    validators=[StepValueValidator(5, offset=2)],
    label="Price"
  )

В этом примере валидатор пропустит значения 2, 7, 12, но отклонит 3 или 10. Формула проверки: (value - offset) % step == 0.

Использование в ModelForm

При создании формы на основе модели, валидатор автоматически добавляется для поля с параметром step:

pythonfrom django.db import models
from django import forms

class Product(models.Model):
  score = models.IntegerField(step=10)
  name = models.CharField(max_length=100)

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

После создания экземпляра формы и передачи невалидных данных, ошибка будет добавлена в словарь errors:

pythonform = ProductForm({'score': 25, 'name': 'Sample Product'})
if not form.is_valid():
  print(form.errors)

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

python{
  "score": ["Ensure this value is a multiple of step 10."]
}

Работа с числами с плавающей точкой

Валидатор также поддерживает числа с плавающей точкой. Например, для поля с шагом 0.5:

pythonfrom django import forms
from django.core.validators import StepValueValidator

class MeasurementForm(forms.Form):
  weight = forms.FloatField(
    validators=[StepValueValidator(0.5)],
    label="Weight"
  )

Валидатор пропустит значения 1.5, 2.0, 2.5, но отклонит 1.7 или 3.2.

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

  • валидатор MaxValueValidator,
    который проверяет, что значение не превышает заданный максимум
  • валидатор MinValueValidator,
    который проверяет, что значение не меньше заданного минимума
  • класс Form,
    который используется для создания форм в Django
  • метод is_valid,
    который запускает процесс валидации формы