2016-10-28 4 views
0

하나새로운 사용자 정의 사용자를 만들거나 기존 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) 

이를 새 사용자를 만듭니다. 그러나 이미 등록 된 이메일로이 엔드 포인트에 도달하려고하면 오류가 발생합니다. 이 대신에 사용자가 활성화되어 있지 않고 다시 등록하려고 할 때 사용자 항목을 업데이트하려고합니다. 나는 이것을 알아낼 수 없다. serializer에서 update() 메서드를 사용하여 시도했지만 작동하지 않았다. 도와주세요.

답변

0

이 작업은 serializer의 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() 및 serializer create()에 print 문을 넣으려고했습니다. 존재하지 않는 전자 우편을 위해 두 진술 모두 인쇄되지만, 현존하는 전자 우편의 경우에는 아무 것도 인쇄되지 않습니다. – toothie

+0

질문에이 오류의 추적을 추가 할 수 있습니까? – lucasnadalutti

+0

오류는 없습니다. "이 이메일 주소를 가진 사용자가 이미 있습니다." 응답이 400 상태 코드와 함께 반환됩니다. – toothie