Django:如何覆盖唯一验证器错误消息?

mas*_*cai 5 authentication django django-models django-rest-framework

我有一个自定义用户模型类

\n
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager\n\nclass CustomUser(AbstractBaseUser, PermissionsMixin)\n    ...\n    email = models.EmailField(_('email address'), unique=True)\n    user_name = models.CharField(max_length=150, unique=True) # Full name\n    phone_number = models.CharField(max_length=20, unique=True)\n
Run Code Online (Sandbox Code Playgroud)\n

及相关视图

\n
class CustomUserViewSet(viewsets.ModelViewSet):\n    pagination_class = BasePagination\n    queryset = CustomUser.objects.all()\n    ...\n\n    def create(self, request, *args, **kwargs):\n        serializer = CustomUserSerializer(data=request.data)\n\n        if serializer.is_valid():\n            user = serializer.save()\n            if user:\n                json = serializer.data\n                send_invitation_email(\n                    user=user,\n                    email=json["email"],\n                    password=request.data["password"],\n                    phone=json["phone_number"]\n                )\n                create_chats(user)\n                return Response(json, status=status.HTTP_201_CREATED)\n        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)\n
Run Code Online (Sandbox Code Playgroud)\n

如果电子邮件、用户名重复,我会收到以下错误消息:

\n
\n

{"user_name":["自定义用户 \xd1\x81 \xd1\x82\xd0\xb0\xd0\xba\xd0\xb8\xd0\xbc 用户名 \xd1\x83\xd0\xb6\xd0\xb5 \xd1\ x81\xd1\x83\xd1\x89\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd1\x83\xd0\xb5\xd1\x82。"]}

\n
\n

如何使用我的自定义消息覆盖此消息的错误:

\n
\n

{"用户名":["\xd0\x9f\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xbb\xd1\ x8c \xd1\x81 \xd1\x82\xd0\xb0\xd0\xba\xd0\xb8\xd0\xbc \xd0\xb8\xd0\xbc\xd0\xb5\xd0\xbd\xd0\xb5\xd0\xbc \ xd1\x83\xd0\xb6\xd0\xb5\xd1\x81\xd1\x83\xd1\x89\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd1\x83\xd0\xb5\xd1\ x82。”]}

\n
\n

更新\n我更新了我的序列化器

\n
class CustomUserSerializer(serializers.ModelSerializer):\n    avatar = serializers.FileField(use_url=False, required=False)\n    organization = OrganizationSimpleSerializer(required=False, read_only=True)\n    user_type = DepartmentSerializer(required=False, read_only=True)\n\n    organization_id = serializers.IntegerField(required=True, write_only=True)\n    user_type_id = serializers.IntegerField(required=True, write_only=True)\n\n    class Meta:\n        model = CustomUser\n        fields = [\n            ...\n        ]\n        read_only_fields = ("id",)\n        extra_kwargs = {}\n        extra_kwargs = {\n            "password": {"write_only": True},\n            "user_name": {\n                "error_messages": {"unique": "\xd0\x9f\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xbb\xd1\x8c \xd1\x81 \xd1\x82\xd0\xb0\xd0\xba\xd0\xb8\xd0\xbc \xd0\xb8\xd0\xbc\xd0\xb5\xd0\xbd\xd0\xb5\xd0\xbc \xd1\x83\xd0\xb6\xd0\xb5 \xd1\x81\xd1\x83\xd1\x89\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd1\x83\xd0\xb5\xd1\x82."}\n            },\n            "email": {\n                "error_messages": {"unique": "\xd0\x9f\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xbb\xd1\x8c \xd1\x81 \xd1\x82\xd0\xb0\xd0\xba\xd0\xbe\xd0\xb9 \xd1\x8d\xd0\xbb\xd0\xb5\xd0\xba\xd1\x82\xd1\x80\xd0\xbe\xd0\xbd\xd0\xbd\xd0\xbe\xd0\xb9 \xd0\xbf\xd0\xbe\xd1\x87\xd1\x82\xd0\xbe\xd0\xb9 \xd1\x83\xd0\xb6\xd0\xb5 \xd1\x81\xd1\x83\xd1\x89\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd1\x83\xd0\xb5\xd1\x82"}\n            },\n            "phone_number": {\n                "error_messages": {"unique": "\xd0\x9f\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xbb\xd1\x8c \xd1\x81 \xd1\x82\xd0\xb0\xd0\xba\xd0\xb8\xd0\xbc \xd1\x82\xd0\xb5\xd0\xbb\xd0\xb5\xd1\x84\xd0\xbe\xd0\xbd\xd0\xbe\xd0\xbc \xd1\x83\xd0\xb6\xd0\xb5 \xd1\x81\xd1\x83\xd1\x89\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd1\x83\xd0\xb5\xd1\x82"}\n            }\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

但我没有看到错误消息,我看到的是:

\n
{"user_name":["\xd0\x9f\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c \xd1\x81 \xd1\x82\xd0\xb0\xd0\xba\xd0\xb8\xd0\xbc user name \xd1\x83\xd0\xb6\xd0\xb5 \xd1\x81\xd1\x83\xd1\x89\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd1\x83\xd0\xb5\xd1\x82."],"phone_number":["\xd0\x9f\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c \xd1\x81 \xd1\x82\xd0\xb0\xd0\xba\xd0\xb8\xd0\xbc phone number \xd1\x83\xd0\xb6\xd0\xb5 \xd1\x81\xd1\x83\xd1\x89\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd1\x83\xd0\xb5\xd1\x82."]}\n
Run Code Online (Sandbox Code Playgroud)\n

看起来检查序列化器级别不起作用

\n

小智 3

您可以像这样在序列化器中的验证器中添加消息

\n

所以CustomUserSerializer输入这段代码:

\n
def validate_username(self,value):\n   if your_logic:\n      return value\n   raise serializers.ValidationError(\'\xd0\x9f\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xbb\xd1\x8c \xd1\x81 \xd1\x82\xd0\xb0\xd0\xba\xd0\xb8\xd0\xbc \xd0\xb8\xd0\xbc\xd0\xb5\xd0\xbd\xd0\xb5\xd0\xbc \xd1\x83\xd0\xb6\xd0\xb5 \xd1\x81\xd1\x83\xd1\x89\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd1\x83\xd0\xb5\xd1\x82.\')\n
Run Code Online (Sandbox Code Playgroud)\n