重写dj-rest-auth注册序列化器失败:添加name字段不生效
解决dj-rest-auth自定义注册序列化器添加name字段不生效的问题
你的自定义序列化器未生效的核心原因是没有重写父类的get_cleaned_data和save方法,导致新增的name字段无法被保存到用户模型;另外Meta类覆盖fields会丢失父类自带的必要字段(如密码字段),破坏注册流程。
步骤1:确保用户模型包含name字段
如果使用自定义User模型,先确认模型里有name字段:
# accounts/models.py from django.contrib.auth.models import AbstractUser class User(AbstractUser): name = models.CharField(max_length=100) # 其他自定义字段...
同时在settings.py中指定自定义用户模型:
# settings.py AUTH_USER_MODEL = 'accounts.User'
步骤2:修正自定义注册序列化器
重写get_cleaned_data将name加入清洗数据,再重写save方法保存该字段:
# accounts/serializers.py from dj_rest_auth.registration.serializers import RegisterSerializer from rest_framework import serializers from django.contrib.auth import get_user_model User = get_user_model() class CustomRegisterSerializer(RegisterSerializer): name = serializers.CharField(max_length=100) def get_cleaned_data(self): # 继承父类的清洗数据,新增name字段 cleaned_data = super().get_cleaned_data() cleaned_data['name'] = self.validated_data.get('name') return cleaned_data def save(self, request): # 调用父类保存用户,再设置name字段并保存 user = super().save(request) user.name = self.cleaned_data.get('name') user.save() return user
步骤3:验证配置正确性
保持你的settings.py和路由配置不变,确保REST_AUTH_REGISTER_SERIALIZERS路径正确指向自定义序列化器:
# settings.py ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_EMAIL_VERIFICATION = 'none' REST_AUTH_REGISTER_SERIALIZERS = { 'REGISTER_SERIALIZER': 'accounts.serializers.CustomRegisterSerializer' }
# urls.py urlpatterns = [ path('', include('dj_rest_auth.urls')), path('registration/', include('dj_rest_auth.registration.urls')), ]
关键说明
- 不需要在序列化器的Meta类中覆盖
fields,父类已经包含email、password1、password2等必要字段,覆盖会导致注册时缺少必填参数 - 必须通过
get_cleaned_data收集新增字段的验证数据,再在save方法中写入用户实例,这是dj-rest-auth扩展自定义字段的标准方式
内容的提问来源于stack exchange,提问作者bello
相关产品推荐
相关产品推荐

