Если в вашей модели есть поле с именем url
, и вы определяете метод clean_url () в ModelForm, он должен вызываться при наличии URL-адреса независимо от того, является ли оно необязательным полем. Выполняя проверку в методе save, вы смешиваете проблемы и нарушаете дизайн класса ModelForm. Проверка правильности всегда должна считаться завершенной после успешного вызова is_valid ().
Но, кроме этого, у вас есть еще одна проблема.
Помните, URL пишется scheme://host:port/absolute_path
. Абсолютный путь закодирован в URL, но сам URL - это больше, чем просто абсолютный путь.
Проблема с относительными путями заключается в определении того, к чему они относятся. Абсолютные пути начинаются с начального символа '/' и всегда относятся к корню сервера или файловой системы. Относительные пути относятся к текущему активному ресурсу. Проблема здесь в том, каков текущий активный ресурс? Кроме того, информирование save () об этой информации (и, следовательно, ее требование) наверняка является нарушенной архитектурой.
Кроме того, ваш код выше будет работать на альтернативных схемах (https), он не вставляет хост в URL, а для путей, не относящихся к корню, как мы узнаем, к чему они относятся?
Я думаю, у вас была правильная стратегия для начала. Разрешить ввод только абсолютных путей и URL, а не относительных путей. Пусть ваша ModelForm заменит абсолютные пути на действительные URL. Для этого еще раз взгляните на документацию для методов clean () в ModelForm, и, если у вас возникнут проблемы с этим, откройте новый вопрос, относящийся к этой проблеме.