我在 Djoser 中为 user_create 和 current_user 端点创建了两个自定义序列化器。 我还想在用户注册中添加 re_password 字段。但是当我在 Djoser 的设置中添加
"USER_CREATE_PASSWORD_RETYPE": True
时,我的创建用户序列化器不起作用,而默认序列化器起作用。能告诉我问题出在哪里吗?
这是我的序列化器:
from djoser.serializers import UserSerializer as BaseUserSerializer, UserCreateSerializer as BaseUserCreateSerializer
class UserCreateSerializer(BaseUserCreateSerializer):
class Meta(BaseUserCreateSerializer.Meta):
fields = ['id', 'username', 'password', 'email', 'first_name', 'last_name']
class UserSerializer(BaseUserSerializer):
class Meta(BaseUserSerializer.Meta):
fields = ['id', 'username', 'email', 'first_name', 'last_name', 'password']
这是 Djoser 的设置:
DJOSER = {
"USER_CREATE_PASSWORD_RETYPE": True,
"SERIALIZERS": {
'user_create': 'core.serializers.UserCreateSerializer',
'current_user': 'core.serializers.UserSerializer',
}
}
最后我继承了 UserCreatePasswordRetypeSerializer 而不是 UserCreateSerializer 来同时拥有 re_password 字段和我的自定义序列化器。 我还从设置中删除了
"USER_CREATE_PASSWORD_RETYPE": True
并且它可以正常工作。
无需从settings.py 中删除
"USER_CREATE_PASSWORD_RETYPE": True
。您只需要定义新的序列化器
from djoser.serializers import UserCreatePasswordRetypeSerializer
class CustomUserCreatePasswordRetypeSerializer(UserCreatePasswordRetypeSerializer):
class Meta(UserCreatePasswordRetypeSerializer.Meta):
fields = ['id', 'username', 'password', 'email', 'first_name', 'last_name']
并在settings.py中
DJOSER = {
"SERIALIZERS": {
'user_create_password_retype': 'core.serializers.CustomUserCreatePasswordRetypeSerializer',
}
}
因为当
user_create_password_retype
设置为 "USER_CREATE_PASSWORD_RETYPE"
时,它使用 True
序列化器。
from djoser.serializers import UserCreatePasswordRetypeSerializer
class CustomUserCreatePasswordRetypeSerializer(UserCreatePasswordRetypeSerializer):
class Meta(UserCreatePasswordRetypeSerializer.Meta):
fields = ['id', 'username', 'email', 'first_name', 'last_name', 'password']
DJOSER = {
'PASSWORD_RESET_CONFIRM_URL': '#/password/reset/confirm/{uid}/{token}',
'USERNAME_RESET_CONFIRM_URL': '#/username/reset/confirm/{uid}/{token}',
'ACTIVATION_URL': '#/activate/{uid}/{token}',
'SEND_ACTIVATION_EMAIL': True,
'USER_CREATE_PASSWORD_RETYPE': True,
'SERIALIZERS': {
'user_create': 'core.serializers.UserCreateSerializer',
'current_user': 'core.serializers.UserSerializer',
'user_create_password_retype': 'core.serializers.CustomUserCreatePasswordRetypeSerializer',
},
}
这对我有用
设置 Djoser
"SERIALIZERS":{
'user_create':'account.serializers.CustomUserCreateSerializer',
'user':'account.serializers.CustomUserCreateSerializer',
'user_delete': 'djoser.serializers.UserDeleteSerializer',
'user_create_password_retype': 'account.serializers.CustomUserCreateSerializer',
'password_reset': 'account.serializers.PasswordResetEmailSentSerializer',
},
自定义序列化器
from djoser.serializers import SendEmailResetSerializer, UserCreatePasswordRetypeSerializer
from rest_framework import serializers
from account.models import CustomUser
class CustomUserCreateSerializer(UserCreatePasswordRetypeSerializer):
class Meta(UserCreatePasswordRetypeSerializer.Meta):
model = CustomUser
fields =('id','first_name','last_name','email','phone_number','password',)