【问题标题】:Django EmailField accepts any value (including blank)Django EmailField 接受任何值(包括空白)
【发布时间】:2015-01-13 10:40:48
【问题描述】:

拥有这个 Django 模型:

class Subscriber(models.Model):
    email = models.EmailField(unique=True, blank=False)

在使用空电子邮件创建订阅者时我没有遇到任何异常:

>>> Subscriber.objects.create(email='')
<Subscriber: Subscriber object>

有趣的是它会第二次引发 IntegrityError:

>>> Subscriber.objects.create(email='')
...
IntegrityError: column email is not unique

所以它似乎验证了完整性,但既不是电子邮件格式也不是空白条目。如何验证电子邮件?

【问题讨论】:

    标签: python django emailfield


    【解决方案1】:

    参数blank从表单中使用,在数据库级别没有强制执行

    来自documentation

    Field.blank 如果为True,则该字段允许为空。默认为 假的。

    请注意,这与 null 不同。 null 纯粹是 与数据库相关,而空白与验证相关。如果一个字段有 空白=真,表单验证将允许输入空值。如果一个 字段有空白=假,该字段将是必需的。

    确实validator documentation 这么说

    请注意,保存模型时验证器不会自动运行

    强制您必须使用full_clean() 方法。

    抛出错误是因为您尝试插入两次空字符串并且您有 字段的唯一约束。

    【讨论】:

    • 感谢您的回答,现在我明白为什么会抛出 IntegrityError,但是我仍然不明白为什么没有抛出验证错误。我已将我的问题编辑得更具体。
    • @VadimTikanov 因为正如我已经写过的,验证器仅从表单而不是模型本身运行。我参考文档更新了答案。
    • 我使用了这个参考:docs.djangoproject.com/en/2.1/ref/models/instances/…。这篇文章中的链接似乎已失效。
    【解决方案2】:

    您必须使用这样的内置电子邮件验证器来验证您的电子邮件字段

    from django.core.validators import validate_email
    

    并以这种方式声明您的电子邮件字段

    email = models.EmailField(unique=True, validators=[validate_email,])
    

    这样它将使用内置的正则表达式验证您的电子邮件字段

    【讨论】:

    • 这不能回答问题。对于blank=False,字段验证器应该拒绝它,无论它是否是有效的电子邮件地址。
    • 如果您执行type(''),则您不会传递空白,它会返回str,但是空白字段应该是 None 它是您声明为电子邮件而不是空白的空字符串。
    • 其实str('')还是一个空白的str,而不是None。但是,这并没有改变这样一个事实,即检查它是否是一个有效的电子邮件地址与验证它不是一个空白字符串是不同的。
    • 为什么不让验证器负责验证它不会匹配空字符串以确保您可以看到使用的正则表达式here
    • 我导入了 validate_email,将其添加到 EmailField 参数并运行迁移。但是,我仍然可以使用 email = '' 或 email = 'aa' 创建订阅者。我还应该在视图中的某处调用验证方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2019-10-07
    相关资源
    最近更新 更多