在django rest框架中创建用户时验证用户名

在django rest框架中创建用户时验证用户名,django,django-rest-framework,Django,Django Rest Framework,在这里,我编写了用于注册用户的序列化程序,并尝试使用validate\u username函数验证用户名,但没有起作用 异常类型:类型错误异常值:字符串索引必须为 整数异常位置:…validate_username中的serializers.py, 第40行 序列化程序.py class UserSerializer(serializers.ModelSerializer): profile = ProfileSerializer(required=False) email =

在这里,我编写了用于注册用户的序列化程序,并尝试使用
validate\u username
函数验证用户名,但没有起作用

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

序列化程序.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
class UserSerializer(serializers.ModelSerializer):
profile=ProfileSerializer(必需=False)
email=serializers.EmailField(验证器=[UniqueValidator(queryset=get\u user\u model().objects.all())])
password1=serializers.CharField(必需=True,只写=True)
password2=serializers.CharField(必需=True,只写=True)
类元:
模型=获取用户模型()
字段=[“名字”、“姓氏”、“用户名”、“电子邮件”、“密码1”、“密码2”、“个人资料”]
def validate_密码1(自身、密码):
validators.validate\u password(password=password,user=get\u user\u model())
def validate_密码2(自身、密码):
validators.validate\u password(password=password,user=get\u user\u model())
def验证(自身、数据):
如果数据['password1']!=数据['password2']:
raise serializers.ValidationError(“两个密码字段不匹配”)
返回数据
def验证_用户名(自验证_数据):
用户名=已验证的_数据['username']
如果len(用户名)<6且len(用户名)>15:
raise ValidationError('用户名长度必须介于6到15个字符之间')
返回用户名
def创建(自我验证的_数据):
user=get\u user\u model().objects.create(
用户名=已验证的_数据['username'],
电子邮件=已验证的_数据['email'],
first_name=已验证的_数据['first_name'],
last_name=已验证的_数据['last_name'],
)
user.set_密码(已验证的_数据['password2'])
user.is_staff=True
user.save()
profile\u data=validated\u data.pop(‘profile’)
Profile.objects.create(
user=user,address=profile\u data['address'],contact=profile\u data['contact']
)
返回用户

问题在于,当使用方法而不是字典时,您是通过参数(在您的例子中是字符串)获得实际值的。因此,下面的代码应该修复它:

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
def validate_用户名(self,username):
如果len(用户名)<6或len(用户名)>15:
raise ValidationError('用户名长度必须介于6到15个字符之间')
返回用户名

在函数validate\u username中,您需要验证的\u数据作为参数。验证\作为自定义“字段级”验证程序,字段值是收到的参数。总的来说

def validate_<field-name>(self, field_name):
    # Your code
def validate_(自身,字段名称):
#你的代码
为了更好地验证密码,可以使用正则表达式

比如说,

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


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

已尝试,但未检查if条件,尽管错误已消失now@ruddra
if
条件应为
if len(用户名)<6或len(用户名)>15
不相关,但上面有一个问题,我正在像这样验证我的密码。目前它正在工作,但有没有更好的方法来验证密码?如果验证
password1
,然后验证它们是否相同,你不必验证
password2
。@Marek我也有同样的想法,因此尝试了这个方法,但总是会出现验证错误,说密码不匹配,所以我验证了password1和password2