zoukankan      html  css  js  c++  java
  • 关于Got AttributeError when attempting to get a value for field `password_confirm` on serializer `RegisterSerializer`. xxx.Original exception text was: 'User' object has no attribute 'password_confirm'.

    在写一个drf的注册接口时报错,

    我的序列化器:

    class RegisterSerializer(serializers.ModelSerializer):
        password_confirm = serializers.CharField(label="确认密码",min_length=6,max_length=20,help_text="确认密码",error_messages={'min_length':'要求6~20个字符', 'max_length':'要求6-20个字符'})
        token = serializers.CharField(label='生成token',read_only=True)
    
        class Meta:
            model = User
            fields = ('id', 'username', 'password', 'email', 'password_confirm','token')
            extra_kwargs = {
                'username':{
                    'label':'用户名',
                    'help_text':'用户名',
                    'min_length':6,
                    'max_length':20,
                    'error_messages':{
                        'min_length':'要求6~20个字符',
                        'max_length':'要求6~20个字符'
                    }
                },
                'email':{
                    'label':'邮箱',
                    'help_text':'邮箱',
                    'write_only':True,
                    'required':True
                },
                'password':{
                    'label':'密码',
                    'help_text':'密码',
                    'write_only':True,
                    'min_length':6,
                    'max_length':20,
                    'error_messages':{
                        'min_length':'要求6~20个字符',
                        'max_length':'要求6~20个字符'
                    }
                }
    
            }
    
        def validate(self, attrs):
            password = attrs.get('password')
            password_confirm = attrs.get('password_confirm')
            if password != password_confirm:
                raise serializers.ValidationError('两次密码输入不一致')
            return attrs
    
        def create(self, validated_data):
            # 移除数据库模型中不存在的属性
            validated_data.pop('password_confirm')
            # 调用auth/models.py中给出的额create_user(),实现了规范邮箱格式、设置用户级别是否是超级管理员用户、给密码加密保存等一系列操作
            user = User.objects.create_user(**validated_data)  # 内部调用django模型类的save()方法
            # 手动生成token
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)
            user.token = token
            return user

    原因可能在于 确认密码 字段数据库中是没有的,是不需要存入数据库的,但是在视图的响应中会将其进行序列化输出。所以需对password_confirm字段添加write_only=True属性。

  • 相关阅读:
    20145222GDB调试汇编堆栈过程分析
    实验二-固件设计 20145213祁玮 20145222黄亚奇
    VS2015下如何用编译、调试程序。
    20145222《信息安全系统设计基础》第11周学习总结
    第八章教材内容总结:异常控制流
    20145222《信息安全系统设计基础》第十周学习总结
    who命令的总结
    20145222《信息安全系统设计基础》第九周学习总结
    《信息安全系统设计基础》实验过程中遇到的问题以及解决方案
    Selenium学习笔记||十四、浏览器页面刷新、前进、后退
  • 原文地址:https://www.cnblogs.com/wangyi0419/p/15306976.html
Copyright © 2011-2022 走看看