首页 > 解决方案 > django 表单验证 - 验证错误自定义消息不起作用

问题描述

这是一个 Django 休息项目,我正在创建一个用户注册表单。我为用户名写了一个验证,如下所示,但我的自定义验证错误没有显示,它显示如下默认消息......我该如何解决这个问题?

def validate_username我的另一个问题是:和之间有什么区别def clean_username

谢谢你

这是默认的 Django 消息:

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

这是我的看法:

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

这是我的序列化器:

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

标签: pythondjangodjango-rest-framework

解决方案


唯一的消息来自以下模型:

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."),
    },
)

在您的情况下,您需要在序列化程序中重写用户名的 UniqueValidator。

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 = 'این نام کاربری آزاد نمیباشد'

推荐阅读