0

This is a Django rest project I'm creating a user registration form .. I wrote a validation for username like below but my custom validation error is not showing and it shows a default message like below... how can I fix this?

My other question is: Whats the difference between def validate_username and def clean_username

Thank You

This is the default Django message:

"{
    "username": [
        "A user with that username already exists."
    ]
}
"

This is my view:

class UserRegisterApiView(CreateAPIView):
    permission_classes = [AllowAny]
    serializer_class = UserRegisterSerializer
    queryset = User.objects.all()

This is my serilizer:

class UserRegisterSerializer(ModelSerializer):
    #email2 = EmailField(label='confirm email')
    email = EmailField(label='email', )

    class Meta:
        model = User
        fields = [
            'username',
            'first_name',
            'email',
            'password',

        ]
        extra_kwargs = {
            "password": {
                "write_only": True
            }
        }

    # check if the user name is taken
    def validate_username(self, value):
        username = value
        qs = User.objects.filter(username=username)
        if qs.exists():
            raise ValidationError("این نام کاربری آزاد نمیباشد")
        return value
1
  • This question should help. Commented Apr 26, 2018 at 9:17

1 Answer 1

0

The uniquire message is come from models as:

username = models.CharField(
    _('username'),
    max_length=150,
    unique=True,
    help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
    validators=[username_validator],
    error_messages={
        'unique': _("A user with that username already exists."),
    },
)

In your case,you need to rewrite your username's UniqueValidator in serializer.

class UserRegisterSerializer(ModelSerializer):
    def __init__(self, *args, **kwargs):
        super(UserRegisterSerializer, self).__init__(*args, **kwargs)
        for validator in self.fields['username'].validators:
            from rest_framework.validators import UniqueValidator
            if type(validator) == UniqueValidator:
                validator.message = 'این نام کاربری آزاد نمیباشد'
Sign up to request clarification or add additional context in comments.

2 Comments

when should we use def clean_fieldname function ?
clean_fieldname is used for form,validate_fieldname is used for serializer

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.