无法调用`.is_valid()`,因为在实例化序列化程序实例时没有传递`data =`关键字参数

时间:2017-08-21 13:57:52

标签: django

我真的被困住了。基本上,我想让用户更改他的电话号码。他只需要输入他当前的密码和一个新的电话号码。我想将用户传递给init函数,以便在此过程中验证他当前的密码。但它给了我上面的错误信息。

我的serializers.py是:

class ChangePhoneSerializer(serializers.Serializer):
'''
Change my phone number
'''
password_current=serializers.CharField(max_length=16,allow_blank=False,required=True)
new_phone=serializers.CharField(max_length=13,required=True,allow_blank=False)

def __init__(self,*args,**kwargs):
    self.user=kwargs.pop('user')


def validate(self,data):
    phone=data['new_phone']
    pwd_current=data['password_current']

    errmsg=''
    if not pwd_current:
        errmsg=str(_('Current password must be given'))
    else:
        if not self.user.check_password(pwd_current):
            errmsg=_('Current password is incorrect')


    if errmsg:
        raise serializers.ValidationError(errmsg)

    return data

在我的views.py中:

    data=request.data
    serializer=ChangePhoneSerializer(user=request.user,data=data)
    if serializer.is_valid():
      #do stuff to change the phone

但是它让我爱上面的错误。当我没有使用序列化器时它工作正常。

1 个答案:

答案 0 :(得分:4)

您在super()方法中错过了对__init__()的来电:

def __init__(self, *args, **kwargs):
    self.user = kwargs.pop('user')
    super(ChangePhoneSerializer, self).__init__(*args, **kwargs)