gpt4 book ai didi

django - 在 Django URLField 中允许空方案的最简洁方法

转载 作者:行者123 更新时间:2023-12-01 18:20:42 26 4
gpt4 key购买 nike

我正在使用 Django 2.0 并尝试允许用户在 django ModelForm 中输入指向其网站的链接。我希望我的 URLField 能够验证 url,即使它们没有方案前缀。

我已阅读此解决方案:django urlfield http prefix 。我想知道是否有一种方法可以实现此目的,而无需在 RegexValidator 中编写我自己的自定义正则表达式。重复 URLValidator 中内置的所有正则表达式逻辑似乎不是一个非常 DRY 的解决方案。

我想做如下的事情:

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 并覆盖整个调用方法,以更改它处理方案的方式,但调用方法包含所有正则表达式,因此这似乎不再是 DRY而不是简单地将 URLField 正则表达式复制到我自己的 RegexValidator 中。

是否有更干净或更“Djangonic”的方式来实现这一目标?

最佳答案

您可以在调用 super() 之前对 URLValidator 进行子类化,并使用 http:// 为无方案值添加前缀。这避免了 URLValidator 中的任何重复代码。

from django.core.validators import URLValidator

class OptionalSchemeURLValidator(URLValidator):
def __call__(self, value):
if '://' not in value:
# Validate as if it were http://
value = 'http://' + value
super(OptionalSchemeURLValidator, self).__call__(value)

关于django - 在 Django URLField 中允许空方案的最简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49983328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com