gpt4 book ai didi

具有自定义方案的 Django URLField

转载 作者:行者123 更新时间:2023-12-02 08:12:00 29 4
gpt4 key购买 nike

Django 的 django.db.models.URLField使用django.core.validators.URLValidator :

class URLField(CharField):
default_validators = [validators.URLValidator()]

由于它没有指定接受的方案,因此 URLValidator 默认采用此设置:

schemes = ['http', 'https', 'ftp', 'ftps']

我希望我的 URLField 接受 ssh:// URL,所以我尝试了以下方法:

class SSHURLField(models.URLField):
'''URL field that accepts URLs that start with ssh:// only.'''
default_validators = [URLValidator(schemes=['ssh'])]

但是,当我尝试使用有效的 ssh:// URL 保存新对象时,我被拒绝了。

如果我跳过从 URLField 继承并直接从 CharField 继承,也会发生这种情况:(编辑:实际上,在我重新创建数据库后,这确实有效。我不确定为什么前者不起作用.)

class SSHURLField(models.CharField):
'''URL field that accepts URLs that start with ssh:// only.'''
default_validators = [URLValidator(schemes=['ssh'])]

def __init__(self, *args, **kwargs):
kwargs['max_length'] = 64
super(SSHURLField, self).__init__(*args, **kwargs)

当我在测试中直接使用 URLValidator 时,它可以工作:

def test_url(url):
try:
URLValidator(schemes=['ssh'])(url)
return True
except:
return False

>>> test_url('ssh://example.com/')
True

>>> test_url('http://example.com/')
False

最佳答案

正如 @IainDillingham 在评论中提到的,这是 Django 中的一个错误:覆盖子类 ModelField 的 default_validator 不一定覆盖与该基类关联的 FormField 的 default_validator 。

对于您的示例 django.db.models.URLField,我们可以看到其关联的表单字段[0] 是 django.forms.fields.URLField[1] 。因此,这里的解决方法是还为您的自定义 SSHURLField 覆盖 def formfield(...) ,以引用具有相同验证器的自定义 django.forms.fields.URLField 子类,像这样:

from django.core import validators
from django.db import models
from django.forms.fields import URLField as FormURLField

class SSHURLFormField(FormURLField):
default_validators = [validators.URLValidator(schemes=['ssh'])]

class SSHURLField(models.URLField):
'''URL field that accepts URLs that start with ssh:// only.'''
default_validators = [validators.URLValidator(schemes=['ssh'])]

def formfield(self, **kwargs):
return super(SSHURLField, self).formfield(**{
'form_class': SSHURLFormField,
})

[0] https://github.com/django/django/blob/e17088a108e604cad23b000a83189fdd02a8a2f9/django/db/models/fields/init.py#L2275,L2293
[1]https://github.com/django/django/blob/e17088a108e604cad23b000a83189fdd02a8a2f9/django/forms/fields.py#L650

关于具有自定义方案的 Django URLField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41756572/

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