2016-03-26 3 views
0

Djangoでユーザーモデルをオーバーライドするときに、何か間違っているか、またはEmailFieldを検証する際に問題があるとは確信していません。 は基本的に私が望んでいたことは、ユーザー名を削除し、電子メールアドレスのユーザー名(または一意の識別子)を作ることだった、だから私はDjangoカスタムユーザーモデルEmailFieldが検証されない

class CustomUser(AbstractBaseUser, PermissionsMixin): 
    first_name = models.CharField(_('first name'), max_length=30, blank=True, null=True) 
    last_name = models.CharField(_('last name'), max_length=30, blank=True, null=True) 
    email = models.EmailField(_('email address'), null=False, blank=False, unique=True) 
    is_staff = models.BooleanField(
     _('staff status'), 
     default=False, 
     help_text=_('Designates whether the user can log into this admin site.')) 
    is_active = models.BooleanField(
     _('active'), 
     default=True, 
     help_text=_('Designates whether this user should be treated as ' 
        'active. Unselect this instead of deleting accounts.')) 
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 

    REQUIRED_FIELDS =() 
    USERNAME_FIELD = 'email' 

    objects = CustomUserManager() 

    # Plus all the remaining stuff/methods we need override 

、として私のユーザモデルを上書きしなかった今の問題は、私も無効な電子メールアドレスを持つユーザーを作成することができています、フィールドレベルで検証が行われていないようです。

from django.contrib.auth import get_user_model 
User = get_user_model() 
User(email='iamnotemail', password='pass').save() 
User.objects.get(email='ghjkl') 
<CustomUser: ghjkl> 

私もfield_cleanを追加して、カスタム電子メールフィールドにバリが、運を追加しようとしました。

あなたにアイデアがある場合は助けてください/何かこれに間違っています。

ありがとう:私はモデルフィールドを検証するにはDjango 1.9

答えて

0

を使用していますが、直接インスタンスを保存しないでください。

保存する前におよび/またはfull_clean()をモデルで実行してください。

>>> u = User(username='foo', password='bar', email='foobar') 
>>> u 
<User: foo> 
>>> u.clean_fields() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/home/vikas/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/base.py", line 1161, in clean_fields 
    raise ValidationError(errors) 
django.core.exceptions.ValidationError: {'email': ['Enter a valid email address.']} 
>>> u.full_clean() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/home/vikas/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/base.py", line 1136, in full_clean 
    raise ValidationError(errors) 
django.core.exceptions.ValidationError: {'email': ['Enter a valid email address.']} 
>>> 

読むdjango-docs

@モデルのフィールドの検証についても、このようなユーザーインスタンスを保存する非常に悪い考えです。ユーザーを作成するには常にcreate_user()メソッドを使用してください。

関連する問題