2011-11-10 10 views
0

私は表面的に単純な問題があります。入力されたメールアドレスが有効であるかどうかを確認する必要がありシェルでDjangoモデルの検証は行われません

from django.db import models 

class Email(models.Model): 
    def __unicode__(self): 
     return self.email 
    email = models.EmailField() 

EmailField、according to the docs、:ここに私のmodels.pyです。だから、なぜ私のシェルは私に不正な形式のメールを保存させるのですか?シェルでは:

>>> from emailapp.models import Email 
>>> e = Email(email="sdf") 
>>> e 
<Email: sdf> 
>>> e.save() 
>>> Email.objects.all() 
[<Email: [email protected]>, <Email: [email protected]>, <Email: sdf>] 

管理インターフェイスは、私はこれらの不正な形式の電子メールを保存することはできませんが、シェルdoes.Whyはこれですか?

答えて

2

ドキュメントは明示的にyou have to call validation yourselfです。

+1

私はこの検証とはどこですか?私はまだこのバリデーションを行わずにコンソールにsave()することができないように、バリデーションコードをどこに置くべきか明確ではありません。 julioは以下のようにsave()関数を上書きする必要がありますか?私はそれを行うことができる唯一の方法です[https://docs.djangoproject.com/ja/1.3/topics/db/models/#overriding-model-methods]ですか? – Coder

1

一部のフィールドバリデーターはフォームでのみ有効です(django adminはフォームを使用します)。この場合、EmailFieldは(データベースに)CharFieldに変換されただけです。そのため、シェルからエラーが発生していないのです。

シェルからモデルを作成するのはあまり一般的ではないので、これが行われていると思います。あなたはまだどこでも、彼らが作成されますから、正しい電子メールを確認したい場合は、私はあなたがsave()方法上書きすることをお勧めします:save()メソッドを上書きするよりも

from django.core.validators import email_re 
from django.core.exceptions import ValidationError 

def save(self, *args, **kwargs): 
    if not email_re.match(self.email): 
     raise ValidationError(u'%s is not a correct email' % self.email) 
    super(Email, self).save(*args, **kwargs) 
1

その他、モデルの検証を実行する別の方法は、Djangoのを使用することですpre_save signal。 pre_save信号フックを作成することができます。フックはモデルの検証を実行するfull_clean()メソッドを呼び出すことができます。

関連する問題