簡體   English   中英

Model字段類型和Django中類似的驗證器之間有什么區別?

[英]What is the difference between a Model field type and a similar validator in Django?

例如, EmailFieldvalidator_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM