2016-10-28 5 views
0

1:新しいカスタムユーザーを作成するか、既存のupate私は、カスタム・ユーザー・モデル作成した

class CUserManager(BaseUserManager): 

    def _create_user(self, email, first_name, password, 
        is_staff, is_superuser, **extra_fields): 
     """ 
     Creates and saves a User with the given email and password. 
     """ 
     now = timezone.now() 
     if not email: 
      raise ValueError('The given email must be set') 
     email = self.normalize_email(email) 
     user = self.model(email=email, 
          first_name = first_name, 
          is_staff=is_staff, is_active=False, 
          is_superuser=is_superuser, last_login=now, 
          date_joined=now, **extra_fields) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_user(self, email, first_name, password=None, **extra_fields): 
     return self._create_user(email, first_name, password, False, False, 
           **extra_fields) 

    def create_superuser(self, email, first_name, password, **extra_fields): 
     return self._create_user(email, first_name, password, True, True, 
           **extra_fields) 


class CUser(AbstractBaseUser, PermissionsMixin): 
    email = models.EmailField(_('email address'), max_length=254, unique=True) 
    first_name = models.CharField(_('first name'), max_length=30) 
    last_name = models.CharField(_('last name'), max_length=30, blank=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=False, 
     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) 
    last_updated = models.DateTimeField(_('last updated'), default=timezone.now) 
    image = ProcessedImageField(upload_to= generate_random_filename, 
           processors=[ResizeToFill(640, 640)], 
           format='JPEG', 
           options={'quality': 60}) 

    objects = CUserManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['first_name', 'last_name'] 

    def save(self, *args, **kwargs): 
     try: 
      this = CUser.objects.get(id=self.id) 
      if this.image != self.image: 
       this.image.delete() 
     except: pass 
     super(CUser, self).save(*args, **kwargs) 

マイregisrationシリアライザ:

class UserRegistrationSerializer(serializers.ModelSerializer): 
    password = serializers.CharField(style={'input_type': 'password'}, 
            write_only=True, 
            validators=settings.get('PASSWORD_VALIDATORS')) 
    class Meta: 
     model = User 
     fields = tuple(User.REQUIRED_FIELDS) + (
      User.USERNAME_FIELD, 
      'image', 
      'password', 
     ) 

    def create(self, validated_data): 
     if settings.get('SEND_ACTIVATION_EMAIL'): 
      with transaction.atomic(): 
       user = User.objects.create_user(**validated_data) 
       user.is_active = False 
       user.save(update_fields=['is_active']) 
     else: 
      user = User.objects.create_user(**validated_data) 
     return user 

マイ登録ビュー:

class RegistrationView(generics.CreateAPIView): 
    serializer_class = serializers.UserRegistrationSerializer 
    permission_classes = (
     permissions.AllowAny, 
    ) 

    def perform_create(self, serializer): 
     user = serializer.save() 
     signals.user_registered.send(sender=self.__class__, user=user, request=self.request) 
     if settings.get('SEND_ACTIVATION_EMAIL'): 
      self.send_activation_email(user) 
     elif settings.get('SEND_CONFIRMATION_EMAIL'): 
      self.send_confirmation_email(user) 

これを新しいユーザーを作成します。しかし、すでに登録されている電子メールでこのエンドポイントにヒットしようとすると、エラーが発生します。この代わりに、ユーザーがアクティブでない場合にユーザーエントリを更新して、再度登録したいと考えています。私はこれを理解することができません。シリアライザでupdate()メソッドを使ってみましたが、うまくいきませんでした。助けてください。

答えて

0

シリアライザのcreateメソッドでこれを行います。

def create(self, validated_data): 
    try: 
     user = User.objects.get(email=validated_data['email']) 
     // There was already a user with that email, do something 
    except User.DoesNotExist: 
     user = User.objects.create_user(**validated_data) 
     if settings.get('SEND_ACTIVATION_EMAIL'): 
      with transaction.atomic(): 
       user.is_active = False 
       user.save(update_fields=['is_active']) 

    return user 
+0

私はそれを追加しようとしましたが、私はまだ "このメールアドレスが既に存在するユーザー"を取得しています。ビューのperform_create()とシリアライザcreate()にprintステートメントを入れてみました。存在しない電子メールの場合は、両方のステートメントが印刷されますが、既存の電子メールの場合はいずれも表示されません。 – toothie

+0

このエラーのトレースバックをあなたの質問に追加できますか? – lucasnadalutti

+0

エラーはありません。 "このメールアドレスのユーザーは既に存在しています。" 400状態コードで返される応答です。 – toothie

関連する問題