使用 URLField 优于 TextField 的优势?

Posted

技术标签:

【中文标题】使用 URLField 优于 TextField 的优势?【英文标题】:Advantages to using URLField over TextField? 【发布时间】:2012-04-20 14:05:30 【问题描述】:

据我了解,当您使用 PostgreSQL 数据库时,您应该始终将 TextField 用于可变长度字符串,因为 TextFieldCharField 之间的速度差异在 PostgreSQL 中可以忽略不计。我对 Django 比较陌生,并且正在考虑在我的数据库中使用 TextField 来处理可变长度的 url。我想知道使用URLField 是否有任何优势?使用TextField 而不是URLField 作为网址会被认为是不好的形式吗?

【问题讨论】:

【参考方案1】:

URLField 实际上是 CharField,支持基于 Regexp 的 URL 模式检查和在线验证器(已被基于 RegEx 的验证器取代),如果您不关心 URL 的长度限制,则可以使用 TextField

from django.core.validators import URLValidator

# in model
field = models.TextField(validators=[URLValidator()])

此外,使用 CharField 还是 TextField 取决于您是否要对字段进行最大长度约束,以及哪种元素类型更适合编辑:textarea 或 input。在 PostgreSQL 方面,没有显着差异。

【讨论】:

记录在案,IE can't load URLs longer than about 2,000 chars,所以您可以在 URLField 上将 max_length 设置为 2000 并收工。 任何关于 URLField 弃用的参考? @pravin 这不是 URLField,而是它以前的验证器已被弃用。验证器在线访问 URL 进行验证,现在它被替换为正则表达式验证器以检查 URL 格式的验证。 URLField 默认为 max_length 200,除非您指定其他值【参考方案2】:

试试这个课程:

class LongURLField(TextField):
    description = 'Long URL'

    def __init__(self, verbose_name=None, name=None, **kwargs):
        TextField.__init__(self, verbose_name, name, **kwargs)
        self.validators.append(validators.URLValidator())

    def formfield(self, **kwargs):
        # As with TextField, this will cause URL validation to be performed
        # twice.
        defaults = 
            'form_class': forms.URLField,
        
        defaults.update(kwargs)
        return super(LongURLField, self).formfield(**defaults)

【讨论】:

将 max_length 设置为 2000,你就拥有了完美的字段 :)【参考方案3】:

https://docs.djangoproject.com/en/dev/ref/models/fields/#urlfield 当然,您可以使用 CharField/TextField,但要处理用户输入,并确保用户输入的内容取决于您。

来自源代码:

# 与 CharField 一样,这将导致执行 URL 验证

如果您看到URLField source code,您会发现它实际上是一个带有 URL 验证器的 CharField。

还有其他可以使用的字段,例如 EmailField、ImageField、*Field!

【讨论】:

以上是关于使用 URLField 优于 TextField 的优势?的主要内容,如果未能解决你的问题,请参考以下文章

Django URLField 和 HTML5?

如何验证 django URLfield 是不是来自特定域或主机名?

Django:用户在网站上报告某些 URL

使用 UTF-8 优于 UTF-16 有啥优势? [复制]

为啥 React 的性能优于使用 JQuery 的直接 DOM 操作?

使用 QOpenGLWidget 优于普通 QWidget 的好处