简体   繁体   English

django-rest-auth:自定义注册序列化程序不保存自定义字段

[英]django-rest-auth: Custom Register Serializer not saving custom fields

NOT A DUPLICATE不是重复的

I am building a simple Todo app with Django & ReactJs , and i have ran into a problem with django-rest-auth .我正在使用DjangoReactJs构建一个简单的Todo应用程序,但我遇到了django-rest-auth

the problem is that my custom UserRegisterSerializer only saves a fragment of the request.data and ignore the rest.问题是我的自定义UserRegisterSerializer只保存request.data一个片段而忽略其余部分。 and i have no idea why.我不知道为什么。

Here's my code:这是我的代码:

User Model:用户模型:

class User(AbstractUser):
    id = models.UUIDField(default=uuid.uuid4,
                      primary_key=True, unique=True, editable=False, db_index=True)

    first_name = models.CharField(max_length=100, blank=False)
    last_name = models.CharField(max_length=100, blank=False)

    email = models.EmailField(max_length=247, blank=False, 
                unique=True, error_messages={
                    'unique': _('A user with this email already exists.'),
                    'invalid': _('Invalid e-mail address detected.'),
                    'blank': _('this field may not be blank.')
                })

    phone = models.CharField(max_length=20, blank=True, null=True, 
                unique=True, error_messages={
                     'unique': _('A user with this phone number already exists.'),
                })

    gender = models.CharField(max_length=5, choices=GENDERS, default=NOOP)
    birthday = models.DateField(blank=True, null=True)

    @property
    def user_id(self):
        return self.id

RegisterSerializer(Custom):注册序列化器(自定义):

class UserRegisterSerializer(RegisterSerializer):
    first_name = serializers.CharField(
        write_only=True, required=True, max_length=100)
    last_name = serializers.CharField(
        write_only=True, required=True, max_length=100)

    birthday = serializers.DateField(required=True, write_only=True)
    phone = serializers.CharField(max_length=20, write_only=True, 
             validators=[
                    UniqueValidator(
                       User.objects.all(),
                       message=_('A user with this phone number already exists.')
                    )
             ])

    gender = serializers.ChoiceField(
        write_only=True,
        choices=[
            ('NO-OP', 'Rather not tell'),
            ('M', 'Male'),
            ('F', 'Female'),
        ],
        default='NO-OP'
    )

    def get_cleaned_data(self):
        cleaned_data = super().get_cleaned_data()
        cleaned_data['first_name'] = self.validated_data.get('first_name', '')
        cleaned_data['last_name'] = self.validated_data.get('last_name', '')
        cleaned_data['phone'] = self.validated_data.get('phone', '')
        cleaned_data['birthday'] = self.validated_data.get('birthday', '')
        cleaned_data['gender'] = self.validated_data.get('gender', '')
        print(cleaned_data)
        return cleaned_data

output of print(cleaned_data) : print(cleaned_data)输出:

{'username': 'john_doe', 'password1': 'djangopass', 'email': 'john_doe@email.com', 'first_name': 'John', 'last_name': 'Doe', 'phone': '+555 555 5555', 'birthday': datetime.date(2020, 6, 3), 'gender': 'M'}

Saved user Model:保存的用户模型:

saved_model_image保存的模型图像

I did it with a save method in my CustomRegisterSerializer calling the default save method and updating attributes, for example:我使用 CustomRegisterSerializer 中的保存方法调用默认保存方法并更新属性,例如:

I needed to fill first and last name and profile:我需要填写姓名和个人资料:

class CustomRegisterSerializer(RegisterSerializer):
    first_name = serializers.CharField(required=True)
    last_name = serializers.CharField(required=True)
    profile = serializers.IntegerField(required=True)

    def get_cleaned_data(self):
        super(CustomRegisterSerializer, self).get_cleaned_data()
        return {
            'first_name': self.validated_data.get('first_name', ''),
            'last_name': self.validated_data.get('last_name', ''),
            'email': self.validated_data.get('email', ''),
            'password1': self.validated_data.get('password1', ''),
            'id': self.validated_data.get('id', ''),
            'profile': self.validated_data.get('profile','')
        }
    def save(self, request):
        user = super().save(request)
        user.profile = self.data.get('profile')
        user.save()
        return user

I fixed the issue by using a custom UserAdapter .我通过使用自定义UserAdapter解决了这个问题。

here's the code of adapter.py :这是adapter.py的代码:

from allauth.account.adapter import DefaultAccountAdapter
from allauth.account.utils import user_field

class UserAdapter(DefaultAccountAdapter):
    def save_user(self, request, user, form, commit=True):
         data = form.cleaned_data
         birthday = data.get('birthday')
         phone = data.get('phone')
         gender = data.get('gender')
         if birthday:
             setattr(user, 'birthday', birthday)
         if phone:
             user_field(user, 'phone', phone)
         if gender:
             user_field(user, 'gender', gender)
         return super().save_user(request, user, form, commit=commit)

then in your settings.py :然后在您的settings.py

...
ACCOUNT_ADAPTER = 'accounts.adapter.UserAdapter'
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在 django-rest-auth 上实现自定义详细信息序列化程序并对其进行序列化 - How to implement a custom detail serializer on django-rest-auth and serialize it django-rest-auth自定义注册无法保存额外的字段 - django-rest-auth custom registration fails to save extra fields 如何在DRF + django-rest-auth中使用自定义用户模型保存有关注册的额外字段 - How to save extra fields on registration using custom user model in DRF + django-rest-auth 在django-rest-auth中使用自定义UserDetailsS​​erializer时的AttributeError - AttributeError when using custom UserDetailsSerializer in django-rest-auth Django-rest-auth (dj-rest-auth) 自定义用户注册 - Django-rest-auth (dj-rest-auth) custom user registration 有什么办法可以改变注册的Django-rest-auth的观点吗? - Is there any way to change view of Django-rest-auth of register? django-rest-auth:为我的测试注册一个活跃用户 - django-rest-auth: register an active user for my tests 使用Django-rest-auth创建新用户时创建自定义用户模型 - Creating custom user model when a new user is created with Django-rest-auth Django Rest Framework v3.0:如何在保存对象时将自定义序列化程序字段映射到模型字段? - Django Rest Framework v3.0 : How to map custom serializer fields to model field while saving an object? django-rest-auth和django-rest-knox的AttributeError-令牌序列化器 - AttributeError with django-rest-auth and django-rest-knox - Token Serializer
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM