Reputation: 862
Here I am writing serializers for registering the users and trying to validate username with validate_username
function but is not working.
Exception Type: TypeError Exception Value: string indices must be integers Exception Location: ...serializers.py in validate_username, line 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
Upvotes: 1
Views: 1886
Reputation: 1057
In the function validate_username, you are expecting validated_data as your argument. validate_ being custom "field level" validators,field value is the argument received. In general,
def validate_<field-name>(self, field_name):
# Your code
In regard to having a better approach to validate passwords, regex expressions can be used.
For example,
^(?=.*\d).{4,8}$
This Password must be between 4 and 8 digits long and include at least one numeric digit.
Upvotes: 0
Reputation: 51988
The issue is you are getting the actual value through argument(in your case, a string) when using validate_<field_name>
method, not a dictionary. So the following code should fix it:
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
Upvotes: 1