Django Rest Framework - 如何为所有 ModelSerializer 字段创建自定义错误消息?

2024-04-18

这是我的serializers.py(我想为内置用户模型创建一个序列化器):

from rest_framework import serializers

from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('username', 'password', 'email', )

我知道 Django Rest Framework 有它自己的字段验证器,因为当我尝试使用已存在的用户名创建用户时,它会引发错误:

{'username': [u'This field must be unique.']}

我想自定义错误消息并使其显示“此用户名已被占用。请重试”,而不是说“此字段必须是唯一的”。

它还有一个内置的正则表达式验证器,因为当我创建带有感叹号的用户名时,它会显示:

{'username': [u'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.']}

我想自定义正则表达式验证器,以便它只显示“无效的用户名”。

如何自定义每个字段的所有错误消息?

注意:根据这篇文章:Django Rest Framework 序列化器中的自定义错误消息 https://stackoverflow.com/questions/26943985/custom-error-messages-in-django-rest-framework-serializer我可以:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User

    def __init__(self, *args, **kwargs):
        super(UserSerializer, self).__init__(*args, **kwargs)

        self.fields['username'].error_messages['required'] = u'My custom required msg'

但是我该如何处理“唯一”和“正则表达式”验证器呢?我尝试做

self.fields['username'].error_messages['regex'] = u'My custom required msg'

and

self.fields['username'].error_messages['validators'] = u'My custom required msg'

但都不起作用。


为了替换唯一或正则表达式错误消息,您应该更改message相应验证器对象的成员。这可以使用单独的 mixin 类来完成:

from django.core.validators import RegexValidator
from rest_framework.validators import UniqueValidator
from django.utils.translation import ugettext_lazy as _


class SetCustomErrorMessagesMixin:
    """
    Replaces built-in validator messages with messages, defined in Meta class. 
    This mixin should be inherited before the actual Serializer class in order to call __init__ method.

    Example of Meta class:

    >>> class Meta:
    >>>     model = User
    >>>     fields = ('url', 'username', 'email', 'groups')
    >>>     custom_error_messages_for_validators = {
    >>>         'username': {
    >>>             UniqueValidator: _('This username is already taken. Please, try again'),
    >>>             RegexValidator: _('Invalid username')
    >>>         }
    >>>     }
    """
    def __init__(self, *args, **kwargs):
        # noinspection PyArgumentList
        super(SetCustomErrorMessagesMixin, self).__init__(*args, **kwargs)
        self.replace_validators_messages()

    def replace_validators_messages(self):
        for field_name, validators_lookup in self.custom_error_messages_for_validators.items():
            # noinspection PyUnresolvedReferences
            for validator in self.fields[field_name].validators:
                if type(validator) in validators_lookup:
                    validator.message = validators_lookup[type(validator)]

    @property
    def custom_error_messages_for_validators(self):
        meta = getattr(self, 'Meta', None)
        return getattr(meta, 'custom_error_messages_for_validators', {})

然后你可以继承这个 mixin 并更新Meta class:

class UserSerializer(SetCustomErrorMessagesMixin, serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups')
        custom_error_messages_for_validators = {
            'username': {
                UniqueValidator: _('This username is already taken. Please, try again'),
                RegexValidator: _('Invalid username')
            }
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Rest Framework - 如何为所有 ModelSerializer 字段创建自定义错误消息? 的相关文章

随机推荐

  • UITableViewCell 中的 UIScrollView 不滚动

    我正在向具有滚动视图的 UITableView 添加一个单元格 单元格中的代码是 UIScrollView scrollView UIScrollView alloc initWithFrame CGRectMake 0 30 320 44
  • 使用 jQuery 显示 div。 CSS问题

    我有三个 divdisplay inline block 在每个 div 中我都有 divdisplay none当我试图显示隐藏的 div 时 div id show 1000 最近的 div 跳跃 我应该改变什么 我确实喜欢看到 div
  • Java EE 5 API 的单个/完整 Maven 依赖项

    是否有包含整个 Java EE 5 规范 API 的单个 Maven 依赖项 就像
  • Git Push 澄清 - 推送什么?

    When I push http www kernel org pub software scm git docs git push html本地工作目录到中央存储库 执行all中间分支和提交信息 从上次推送到这次 是否被推送 换句话说 是
  • 使用无符号整数溢出是一个好的做法吗?

    前几天我正在阅读 C 标准 并注意到与有符号整数溢出 未定义 不同 无符号整数溢出有明确的定义 我已经看到它在很多代码中用于最大值等 但是考虑到有关溢出的巫毒 这被认为是良好的编程实践吗 无论如何都是不安全的吗 我知道许多现代语言 例如 P
  • 同时打印到屏幕并写入文件

    我在网上找到了一些通常有效的代码 但我想在同一个程序中多次使用它 将不同的内容写入不同的文件 同时仍然始终打印到屏幕上 也就是说 当它关闭时 我认为 sys stdout 关闭 因此根本无法打印 并且再次使用此类会失败 我尝试重新导入 sy
  • 在 MATLAB 中数值计算复值函数的导数

    我想在 MATLAB 中以数值方式计算复值函数 全纯函数 的导数 我已经计算了复平面上网格中的函数 并且尝试使用柯西 黎曼关系来计算导数 鉴于 u 实数 f v imag f x 实数 点 y imag 点 导数应由下式给出 f du dx
  • 如何在 Pygame 中翻转图像

    我希望图像在向右移动时朝右 在向左移动时朝左 我不知道在这里要做什么 这是一项作业 不需要翻转图像 但我仍然想学习如何做到这一点 Author victor Xu Date January 21st 2021 Description Ani
  • 我可以获取指纹值吗?

    我尝试获取指纹值并存储它 之后 我尝试比较一下 value 与来自另一个硬件的指纹值 指纹 sensor Q1 他们之间可以比较吗 Q2 如果可以的话 我怎样才能获得这个值 我搜索过这些问题 发现这是不可能的 但我觉得 获取指纹信息的方法是
  • Realloc 在循环内第 10 次迭代后失败

    我试图从用户那里获取一系列字母 并将输入放入动态数组中 然而 由于我不太明白的原因 如果用户输入超过 10 个字母 则 realloc 失败 返回 NULL 并打印 分配内存时出错 我确实尝试将 realloc 更改为 calloc 这似乎
  • 释放Java 7 WatchService的资源

    我正在使用 Java 7 WatchService 来监视目录 我不断地改变我正在观看的目录 我遇到了异常 java io IOException 已达到网络 BIOS 命令限制 50 个目录之后 我确信在创建新的 WatchService
  • Django '/' 仅主页 url 错误

    我正在使用 Django 2 0 现在我不知道如何为主页创建一个 空 url 意思是 我希望它路由到web com or web com 我尝试了这段代码 但它不起作用 urlpatterns path admin admin site u
  • 使用 Java 将文件附加到 zip 文件

    我当前正在提取一个 war 文件的内容 然后将一些新文件添加到目录结构中 然后创建一个新的 war 文件 这一切都是通过Java以编程方式完成的 但我想知道复制战争文件然后附加文件是否会更有效 然后我就不必等待战争扩大然后必须再次被压缩 我
  • 如何找到射线与移动圆的第一个交点

    我已经在一个问题上苦苦挣扎了一段时间 到目前为止还没有找到比天真的解决方案更好的解决方案 N circles are given that are moving according to a linear law For each of t
  • ReactJS 通过 API 调用保护路由

    我正在尝试保护 ReactJS 中的路由 在每个受保护的路由上 我想检查保存在 localStorage 中的用户是否良好 下面你可以看到我的路线文件 app js class App extends Component render re
  • Doctrine QueryBuilder 和 concat 问题

    我有以下代码 它依赖于 Doctrine 的 QueryBuilder API 来生成 DQL 语句 class PlayerRepository extends EntityRepository public function findB
  • Java:字符串到布尔值

    我必须读一本String从一个字段 然后将其转换为Boolean 我试过这个 ObjectInputStream nm nm new ObjectInputStream new FileInputStream buscamines txt
  • 如何在一个Web应用程序上下文中访问另一个Web应用程序上下文

    我在 Tomcat6 服务器中部署了两个 WAR 例如WAR A WAR B in Context A and Context B分别 我已经存储了一些数据Context A 我想读取该数据Context B 我已经通过网络找到了一些方法来
  • 绑定 Telerik RadTreeView 客户端

    我有一个 javascript 对象数组 我想用它来填充 RadTreeView 除了为我的对象集合手动编写自己的绑定方法之外 我不知道如何从客户端完成此操作 我的 javascript 数组中的每个对象都有 ID 父ID 价值 文本 有没
  • Django Rest Framework - 如何为所有 ModelSerializer 字段创建自定义错误消息?

    这是我的serializers py 我想为内置用户模型创建一个序列化器 from rest framework import serializers from django contrib auth models import User