Python Django中的模型字段类型和类似的验证器有什么区别?
比如说,a和a之间有什么区别?两者兼用是不是一个坏主意 或者对于那些执行代码的人Python Django中的模型字段类型和类似的验证器有什么区别?,python,django,validation,Python,Django,Validation,比如说,a和a之间有什么区别?两者兼用是不是一个坏主意 或者对于那些执行代码的人 import django.db import models email = models.EmailField() vs 从文档中看,您似乎也可以在表单中使用验证程序,但是如果您已经在models.py中指定了验证限制,那么您不需要在表单中再次指定,对吗?因此,在我看来,最好处理models.py中的所有限制,我认为差异很小,但这样做会违反干式原则,除非你有充分的理由这样做,否则你可能不应该这样做 如果转到代码
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
overvalidate\u email
,除非你想自定义错误消息和描述?而DRY原则意味着只在models.py
中指定验证,即不要在表单中重复自己的操作
?我是说,对电子邮件使用EmailField,如果您需要自定义inherit from EmailField,除非它非常笨拙,以至于与EmailField完全无关,在这种情况下,继承CharField的遗产,继续这样做。谢谢。在显示源代码方面也做得很好。信息量很大!