Python Django中的模型字段类型和类似的验证器有什么区别?

Python Django中的模型字段类型和类似的验证器有什么区别?,python,django,validation,Python,Django,Validation,比如说,a和a之间有什么区别?两者兼用是不是一个坏主意 或者对于那些执行代码的人 import django.db import models email = models.EmailField() vs 从文档中看,您似乎也可以在表单中使用验证程序,但是如果您已经在models.py中指定了验证限制,那么您不需要在表单中再次指定,对吗?因此,在我看来,最好处理models.py中的所有限制,我认为差异很小,但这样做会违反干式原则,除非你有充分的理由这样做,否则你可能不应该这样做 如果转到代码

比如说,a和a之间有什么区别?两者兼用是不是一个坏主意

或者对于那些执行代码的人

import django.db import models
email = models.EmailField()
vs


从文档中看,您似乎也可以在
表单中使用
验证程序
,但是如果您已经在
models.py
中指定了验证限制,那么您不需要在
表单中再次指定,对吗?因此,在我看来,最好处理
models.py

中的所有限制,我认为差异很小,但这样做会违反干式原则,除非你有充分的理由这样做,否则你可能不应该这样做

如果转到代码库:

#django.db.fields.__init__.py

class EmailField(CharField):
    default_validators = [validators.validate_email]
    description = _("E-mail address")

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = kwargs.get('max_length', 75)
        CharField.__init__(self, *args, **kwargs)

    def formfield(self, **kwargs):
        # As with CharField, this will cause email validation to be performed
        # twice.
        defaults = {
            'form_class': forms.EmailField,
        }
        defaults.update(kwargs)
        return super(EmailField, self).formfield(**defaults)
如您所见,模型继承自Charfield,因此在适当的情况下使用emailfield不会造成任何损失。此外,默认的验证器是validate_email。此外,您还可以获得已经为您定义的description变量。最后,在后端,它已经将您的最大长度设置为“75”。当然,您可以用创建CharField时相同的方式定义max_length,从而很容易地覆盖此字段

您可以看到formfields()正在从django.forms返回forms.EmailField

看看这个,你可以看到:

#django.forms.fields.py
class EmailField(CharField):
    default_error_messages = {
        'invalid': _(u'Enter a valid e-mail address.'),
    }
    default_validators = [validators.validate_email]

    def clean(self, value):
        value = self.to_python(value).strip()
        return super(EmailField, self).clean(value)
但是,您将丢失使用EmailField可能提供的任何默认值,例如“正确”错误消息和自定义clean()方法

最后,虽然它看起来很小,但实际上已经为您做了很多工作。所以,一般来说,除非你有充分的理由这样做,否则你不应该违反干式原理

编辑:


关于第二个问题,您希望表单根据您关心的任何条件进行验证,因此当您调用form.is_valid()时,它会在应该时返回True/False,并生成相应的失败消息。否则,is_valid()将验证True,并且当您的模型进行保存时,它将无声地失败,这将非常难以跟踪。

我认为差异很小,但是您将违反DRY原则,除非您有充分的理由这样做,否则您可能不应该这样做

如果转到代码库:

#django.db.fields.__init__.py

class EmailField(CharField):
    default_validators = [validators.validate_email]
    description = _("E-mail address")

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = kwargs.get('max_length', 75)
        CharField.__init__(self, *args, **kwargs)

    def formfield(self, **kwargs):
        # As with CharField, this will cause email validation to be performed
        # twice.
        defaults = {
            'form_class': forms.EmailField,
        }
        defaults.update(kwargs)
        return super(EmailField, self).formfield(**defaults)
如您所见,模型继承自Charfield,因此在适当的情况下使用emailfield不会造成任何损失。此外,默认的验证器是validate_email。此外,您还可以获得已经为您定义的description变量。最后,在后端,它已经将您的最大长度设置为“75”。当然,您可以用创建CharField时相同的方式定义max_length,从而很容易地覆盖此字段

您可以看到formfields()正在从django.forms返回forms.EmailField

看看这个,你可以看到:

#django.forms.fields.py
class EmailField(CharField):
    default_error_messages = {
        'invalid': _(u'Enter a valid e-mail address.'),
    }
    default_validators = [validators.validate_email]

    def clean(self, value):
        value = self.to_python(value).strip()
        return super(EmailField, self).clean(value)
但是,您将丢失使用EmailField可能提供的任何默认值,例如“正确”错误消息和自定义clean()方法

最后,虽然它看起来很小,但实际上已经为您做了很多工作。所以,一般来说,除非你有充分的理由这样做,否则你不应该违反干式原理

编辑:


关于第二个问题,您希望表单根据您关心的任何条件进行验证,因此当您调用form.is_valid()时,它会在应该时返回True/False,并生成相应的失败消息。否则,is_valid()将验证True,并且当您的模型进行保存时,它将以静默方式失败,这将非常难以跟踪。

您是说使用
电子邮件字段
覆盖
验证电子邮件
,除非您想要自定义类似错误消息和描述的内容?而DRY原则意味着只在
models.py
中指定验证,即不要在
表单中重复自己的操作
?我是说,对电子邮件使用EmailField,如果您需要自定义inherit from EmailField,除非它非常笨拙,以至于与EmailField完全无关,在这种情况下,继承CharField的遗产,继续这样做。谢谢。在显示源代码方面也做得很好。信息量很大!所以你是说使用
EmailField
over
validate\u email
,除非你想自定义错误消息和描述?而DRY原则意味着只在
models.py
中指定验证,即不要在
表单中重复自己的操作
?我是说,对电子邮件使用EmailField,如果您需要自定义inherit from EmailField,除非它非常笨拙,以至于与EmailField完全无关,在这种情况下,继承CharField的遗产,继续这样做。谢谢。在显示源代码方面也做得很好。信息量很大!