在Django Rest框架中创建用户时验证用户名

时间:2019-11-25 11:01:14

标签: django django-rest-framework

在这里,我正在编写用于注册用户的序列化程序,并尝试使用validate_username函数来验证用户名,但是没有用。

  

异常类型:TypeError异常值:字符串索引必须为   整数异常位置:validate_username中的... serializers.py,   40行

serializers.py

class UserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer(required=False)
    email = serializers.EmailField(validators=[UniqueValidator(queryset=get_user_model().objects.all())])
    password1 = serializers.CharField(required=True, write_only=True)
    password2 = serializers.CharField(required=True, write_only=True)

    class Meta:
        model = get_user_model()
        fields = ['first_name', 'last_name', 'username', 'email', 'password1', 'password2', 'profile']

    def validate_password1(self, password):
        validators.validate_password(password=password,user=get_user_model())

    def validate_password2(self, password):
        validators.validate_password(password=password,user=get_user_model())



    def validate(self, data):
        if data['password1'] != data['password2']:
            raise serializers.ValidationError("The two password fields didn't match.")
        return data

    def validate_username(self, validated_data):
        username = validated_data['username']
        if len(username) < 6 and len(username) > 15:
            raise ValidationError('Username must be between 6 and 15 characters long')
        return username

    def create(self, validated_data):
        user = get_user_model().objects.create(
            username=validated_data['username'],
            email=validated_data['email'],
            first_name=validated_data['first_name'],
            last_name=validated_data['last_name'],

        )

        user.set_password(validated_data['password2'])
        user.is_staff = True
        user.save()
        profile_data = validated_data.pop('profile')
        Profile.objects.create(
            user=user, address=profile_data['address'], contact=profile_data['contact']
        )

        return user

2 个答案:

答案 0 :(得分:1)

问题是,使用validate_<field_name>方法而不是字典时,您是通过参数(在您的情况下为字符串)获取实际值的。因此,以下代码应对其进行修复:

def validate_username(self, username):
    if len(username) < 6 or len(username) > 15:
        raise ValidationError('Username must be between 6 and 15 characters long')
    return username

答案 1 :(得分:0)

在功能validate_username中,您需要validated_data作为参数。 validate_是自定义的“字段级别”验证器,字段值是接收到的参数。一般来说,

def validate_<field-name>(self, field_name):
    # Your code

关于采用更好的方法来验证密码,可以使用正则表达式。

例如

  

^(?=。* \ d)。{4,8} $

此密码的长度必须介于4到8位之间,并且至少包含一个数字。