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
Alihossein shahabi
  • 4,034
  • 2
  • 33
  • 53
devmrh
  • 1,171
  • 4
  • 19
  • 46

1 Answers1

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 = 'این نام کاربری آزاد نمیباشد'
Ykh
  • 7,567
  • 1
  • 22
  • 31