gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:46:49 27 4
gpt4 key购买 nike

这是我的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.']}

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

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

注意:根据这篇文章: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'

但是我该如何处理“unique”和“regex”验证器呢?我尝试做

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

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 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')
}
}

关于Django Rest Framework - 如何为所有 ModelSerializer 字段创建自定义错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30565389/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com