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属性。

  • 相关阅读:
    (总结)MySQL my.cnf参数配置优化详解
    CentOS下安装使用流量监控工具iftop
    ssh登录亚马逊aws
    linux nat squid ntop
    jquery动态添加Div
    为什么st2 chrome无法显示api中的例子
    使用jquery当页面打开时,将修改样式的点击事件绑定到Dom
    jquery动态添加Div
    使用jquery当页面打开时,将修改样式的点击事件绑定到Dom
    sencha touch 2 mvc调用文件顺序
  • 原文地址:https://www.cnblogs.com/wangyi0419/p/15306976.html
Copyright © 2011-2022 走看看