Я использую Django 2.0 и пытаюсь разрешить пользователям вводить ссылку на свой веб-сайт в django ModelForm. Я хотел бы, чтобы мой URLField проверял URL-адреса, даже если у них нет префикса схемы.
Я прочитал это решение: https://stackoverflow.com/questions/16307055/django-urlfield-http-prefix. Мне интересно, есть ли способ добиться этого без написания собственного регулярного выражения в RegexValidator. Это не похоже на очень СУХОЕ решение для повторения всей логики регулярных выражений, встроенной в URLValidator.
Я хочу сделать что-то вроде следующего:
website = models.CharField(max_length=400, blank=True, null=True, validators=[URLValidator(schemes=['', 'http', 'https', 'ftp', 'ftps'])])
Очевидно, что это не работает из-за того, как метод вызова URLValidator проверяет заданные схемы.
def __call__(self, value):
# Check first if the scheme is valid
scheme = value.split('://')[0].lower()
if scheme not in self.schemes:
raise ValidationError(self.message, code=self.code)
Добавление пустой строки в список схем не работает, потому что разделение URL-адреса таким образом возвращает весь URL-адрес (поскольку пользователь обычно не включает ://, если этот пользователь не включает префикс схемы).
Теперь я мог бы подклассировать URLField и перезаписать весь метод вызова, чтобы изменить способ обработки схем, но метод вызова включает в себя все регулярное выражение, так что это кажется не более СУХИМ, чем простое копирование регулярное выражение URLField в мой собственный RegexValidator.
Есть ли более чистый или более "Djangonic" способ добиться этого?