6

有谁知道如何摆脱 Django urlfield 中的“http://”前缀。

我的意思是当我们将一个字段定义为 urlfield 并尝试输入一个 url 时,如果没有提供架构,django 会自动为其添加“http://”前缀。我不想要那个前缀。

我尝试在 clean_field 和 clean 方法下删除它。它不起作用。

我深入研究了源代码。我看到 django 在 UrlField 类下的 'to_python' 方法中添加了 'http://'。

有没有办法覆盖它以摆脱'http://'?

4

1 回答 1

5

如果没有方案前缀,字符串就不能是真正的 URL,因此URLField将不支持它。

然而,这URLField几乎只是 aCharField和 a URLValidator,所以如果你写一个新的SchemelessURLValidator(从内置的派生)并将它添加到一个 normal 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)
于 2013-04-30T19:19:20.403 回答