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

Django DO

不是重复的

我正在Todo使用Django构建一个简单的应用程序ReactJs,而我却遇到了问题django-rest-auth

问题是我的自定义项UserRegisterSerializer仅保存的一部分,request.data而忽略其余部分。而且我不知道为什么。

这是我的代码:

用户模型:

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(自定义):

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

输出print(cleaned_data)

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

保存的用户模型:

saved_model_image

Django DO

我通过使用自定义解决了这个问题UserAdapter

这是的代码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)

然后在您的settings.py

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Django Rest Framework 序列化自定义字段

Django REST-rest_auth自定义字段未序列化

Django Rest Framework ModelSerializer 自定义序列化器字段 to_internal_value 不会保存到对象

序列化中的嵌套字段在Django REST框架中使用自定义字段

django-rest-auth自定义注册无法保存额外的字段

Django REST序列化程序和自定义模型字段中的其他属性

从序列化程序自定义字段上的Django Rest Order?

如何在Django Rest Framework序列化程序中自定义字段

如果value为null,则自定义Django Rest Framework序列化器字段未运行`to_representation()`

从Django Rest框架中的序列化器发送自定义错误响应?

如何在 Django REST 框架中的自定义序列化程序字段中访问请求对象?

Django REST-从自定义to_internal_value中运行字段验证以进行序列化

Django Rest Framework将查询集序列化为带有自定义字段的字典

使用Django Rest框架序列化自定义数据类型并返回响应

使用 Django Rest Framework 在序列化程序中自定义响应

如何自定义Django REST序列化程序的默认设置

一个如何自定义Django Rest Framework序列化程序输出?

Django REST-完整用户名的自定义序列化程序

Django REST Framework - 自定义序列化程序覆盖模型约束

Django Rest Framework序列化程序中的自定义错误消息

Django Rest框架基于自定义类反序列化对象

自定义来自Django Rest Framework序列化程序的状态代码响应

嵌套序列化程序中的Django Rest Framework自定义URL

自定义字段Django Rest Framework

Django Rest Framework 序列化使用自定义数据类型归档的持续时间

Django Rest Auth-用于社交视图的自定义注册逻辑

Django Rest Framework:仅在自定义验证之后,如何将数据传递给嵌套的序列化器并创建对象

Django Rest Auth自定义重置密码确认网址

Django Rest Framework-按自定义字段过滤