2013-04-30 3 views
5

Кто-нибудь знает, как избавиться от префикса «http: //» в Django urlfield.django urlfield http prefix

Я имею в виду, когда мы определяем поле как urlfield и пытаемся ввести в него URL-адрес, django автоматически добавит к нему префикс «http: //», если никакая схема не предоставляет. Я не хочу этого префикса.

Я пытаюсь удалить его под clean_field и чистым методом. Это не работает.

Я копаю исходный код. Я видел, что django добавляет 'http: //' в метод 'to_python' под классом UrlField.

Есть ли способ переопределить его, чтобы избавиться от 'http: //'?

ответ

4

Без префикса схемы строка не может быть истинным URL, и, соответственно, URLField не поддерживает ее.

Однако URLField довольно много просто CharField с URLValidator, так что если вы пишете новый SchemelessURLValidator (производный от встроенного в одном) и добавить, что к нормальному CharField, который должен получить, где вы хотите идти.

На самом деле, ваш новый валидатор может быть столь же просто, как

class SchemelessURLValidator(URLValidator): 
    regex = re.compile(
    r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' # domain... 
    r'localhost|' # localhost... 
    r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|' # ...or ipv4 
    r'\[?[A-F0-9]*:[A-F0-9:]+\]?)' # ...or ipv6 
    r'(?::\d+)?' # optional port 
    r'(?:/?|[/?]\S+)$', re.IGNORECASE) 
+0

Это звучит как приемлемое решение. Спасибо –

+0

Я пробовал. По крайней мере, в Django 1.5 это становится большим беспорядком. Тем не менее, он работает. – alanjds

Смежные вопросы