DTing имеет несколько замечательных моментов, но я подозреваю, что ваша настоящая проблема связана с вашим явным определением поля id
в вашей модели. Если у вас нет действительно веской причины, вы никогда не должны этого делать - Django определяет поле автоинкремента автоматически, и редко когда есть какая-либо точка, переопределяющая это, если вы не используете устаревшую базу данных, которую нельзя изменить.
В вашем случае вы определили его как tinyint без автоинкремента. Это означает, что поле будет обязательным в любой форме, так как его нужно указывать вручную каждый раз, когда вы создаете новый экземпляр. Вы не показали шаблон, который используете для отображения формы, поэтому в этом нет уверенности, но я полагаю, что вы не показываете это поле вообще.
Если вы действительно хотите продолжать в том же духе, вам нужно указать exclude = ('id',)
в форме Meta
. Затем в своем предложении is_valid, принимая во внимание рекомендации DTing, вам нужно сделать следующее:
if form.is_valid():
instance = form.save(commit=False)
instance.id = some_function_for_calculating_id()
instance.save()
Но, как я уже сказал, вам вообще не следует этого делать.