[英]What is the difference between a Model field type and a similar validator in Django?
例如, EmailField
和validator_email
什么EmailField
? 同時使用這是個壞主意嗎?
或對於那些喜歡代碼的人
import django.db import models
email = models.EmailField()
與
import django.db import models
email = models.CharField( max_length=75, validators = validate_email )
從文檔看來,您似乎也可以在forms
使用validators
,但是如果您已經在models.py
指定了驗證限制,那么就不需要在forms
再次指定,對嗎? 因此,對我來說,照顧好models.py
內部的所有限制似乎更好。
我想差別很小,但是除非您有充分的理由這樣做,否則您將違反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。 此外,您還將獲得已經為您定義的描述變量。 最后,在后端,已經為您將max_length設置為'75'。 您當然可以通過創建max_length的方式(創建CharField時的方式相同)來輕松地覆蓋它。
您可以看到formfields()從django.forms返回form.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()方法。
最后,盡管看起來很小,但實際上已經為您完成了很多工作。 因此,通常,除非有充分的理由,否則您不應該違反DRY主體。
編輯:
關於第二個問題,您希望表單根據您關注的任何條件進行驗證,因此,當您調用form.is_valid()時,它將在應有的情況下返回True / False並生成適當的失敗消息。 否則,is_valid()會驗證True,並且當您保存模型時,它將無聲地失敗,這將很難追蹤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.