Зачем SForm:
------------
SForm решают сразу несколько задач, для которых нет другого инструмента

1. У SForm есть поддержка у нашего фронта. https://github.yandex-team.ru/tools/s-form
2. Валидация словарей имеющих вложенность.
3. Ошибки отдаются только кодами без переводов, так как фронтенд сам решает какой текст когда показывать. При этом вместе с ошибкой можно отдать дополнительные параметры, необходимые для формирования сообщения пользователю.
4. Ошибки отдаются в формате, позволяющем фронту привязать их к нужным сущностям, учитывая сложную вложенную структуру.
5. В наше время фронту не нужен html, но нужны структурированные данные, которые он сможет разобрать. SForm имеет определённую структуру ответа, которую удобно разобрать на фронтенде. При этом она достаточно гибкая и расширяемая.
6. Часто бывает необходимость динамически менять статус полей. В каких-то случаях, в зависимости от данных, поле должно быть обязательным, а иногда доступно только для чтения и эти состояния надо удобно менять.
7. Часто необходимо не только указать, что поле обязательное, но так же и то, что поле не доступно для изменения. В SForm, если поле доступно только для чтения, его данные отдаются с соответствующим признаком, и, если на валидацию будут присланы данные для этого поля, они будут проигнорированны и заменены текущими.
8. SForm умеет не делать много запросов за списком одинаковых сущностей для селектов. Это достигается благодаря тому, что структура формы отдается отдельно от её данных. И там, где много строк с данными, в структуре будет только одно описание.
9. SForm имеют синтаксис очень близкий пользователям Django и, более того, внутри использует Django поля и ValidationError.

Запуск тестов
`docker-compose run tox`
