Django REST Framework用户注册验证混淆

时间:2017-05-13 11:01:27

标签: python django rest api django-rest-framework

我正在尝试使用带有two different methods

的Django REST API注册用户

使用method 1一切正常,但它会给出

这个问题:

https://stackoverflow.com/questions/43952178/django-rest-framework-user-registration-confusion

对于method 2,它会出现以下错误,但会在后端创建用户

  

/ api / users / register /

中的AttributeError      

获得AttributeError时   尝试在序列化程序上获取字段password2的值   UserCreateSerializer。序列化程序字段可能已命名   错误且不匹配User实例上的任何属性或键。   原始例外文字是:'用户'对象没有属性   '密码2'

代码:

from django.contrib.auth import get_user_model
from rest_framework.exceptions import ValidationError

from rest_framework.serializers import (ModelSerializer,CharField)

User = get_user_model()


class UserCreateSerializer(ModelSerializer):
    password2 = CharField(label='Confirm Password')
    class Meta:
        model = User
        fields = [
            'username',
            'password',
            'password2',
            'email',
        ]
        extra_kwargs = {
            'password' : {'write_only': True},
            'password2': {'write_only': True},
        }

    def validate_password(self, value):
        data = self.get_initial()
        password = data.get('password2')
        password2 = value
        if password != password2:
            raise ValidationError('Passwords must match')
        return value

    def validate_password2(self, value):
        data = self.get_initial()
        password = data.get('password')
        password2 = value
        if password != password2:
            raise ValidationError('Passwords must match')
        return value

方法1:

def create(self, validated_data):
    username = validated_data['username']
    email = validated_data['email']
    password = validated_data['password']
    user_obj = User(
        username=username,
        email=email
    )
    user_obj.set_password(password)
    user_obj.save()
    return validated_data

方法2:

 def create(self, validated_data):
        user = User(
            email=validated_data['email'],
            username=validated_data['username'],
        )
        user.set_password(validated_data['password'])
        user.save()
        return user
  

注意:使用Python3,Django 10.7& Django REST框架3

2 个答案:

答案 0 :(得分:0)

您方法中的问题是您传递的是password2,而不是User模型的属性。

通过阅读您的代码,我认为您可以尝试这样的事情,

您可以对此进行对象范围的验证,而不是重复验证每个密码字段。

def validate(self, data):
    password = data.get('password')
    confirm_password = data.pop('password2')
    if password != confirm_password:
        raise ValidationError('.............')
    return data

你写的创建方法就足够了,我希望...... 尝试这个,如果有任何问题,请告诉我..

修改

编辑您的创建方法

def create (self, validated_data):
    email = validated_data.get('email')
    username = validated_data.get('username')
    password = validated_data.get('password')
    try:
        user = User.objects.create(username=username, email=email)
        user.set_password(password)
        user.save()
        return user
    except Exception as e:
        return e

如果任何电子邮件,密码,用户名不可用,可能会触发KeyError。

答案 1 :(得分:0)

请尝试以下操作:将write_only=True添加到password2

class UserCreateSerializer(ModelSerializer):
    password2 = CharField(label='Confirm Password', write_only=True)
    ...