加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何更改DjangoRestFramework序列化程序的“此字段是必需的”错

发布时间:2020-12-20 11:45:40 所属栏目:Python 来源:网络整理
导读:当用户通过 JSON用户对象向后端提交表单时,这是处理它的视图: class user_list(APIView): """ Create a new user. """ def post(self,request): serializer = UserSerializer(data=request.DATA) if serializer.is_valid(): serializer.save() return Respo
当用户通过 JSON用户对象向后端提交表单时,这是处理它的视图:

class user_list(APIView):
    """
    Create a new user.
    """

    def post(self,request):
        serializer = UserSerializer(data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data,status=status.HTTP_201_CREATED)
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

我的问题是,如果用户没有填写表单中的某个字段,DRF发送给前端的错误消息是“此字段是必需的”.有没有办法让我更改它,以便对于所有字段,错误消息是“{fieldname}是必需的.”?

这是我的serializers.py:

from rest_framework import serializers
from django.contrib.auth.models import User
from CMSApp.mixins import SetCustomErrorMessagesMixin

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


class UserSerializer(SetCustomErrorMessagesMixin,serializers.ModelSerializer):

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

        extra_kwargs = {
                    'password': {
                        'write_only': True,}
                }

        custom_error_messages_for_validators = {
            'username': {
                UniqueValidator: _('This username is already taken. Please try again.'),RegexValidator: _('Invalid username')
            }
        }

    def create(self,validated_data):
        user = User.objects.create_user(
            email = validated_data['email'],username = validated_data['username'],password = validated_data['password'],)
        return user

这是SetCustomErrorMessageMixin:

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

最后,这是我的models.py(UserExtended模型):

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Color(models.Model):
    colorName = models.CharField(max_length=50,unique=True)
    colorCode = models.CharField(max_length=10,unique=True)

class UserExtended(models.Model):
    user = models.OneToOneField(User,related_name="userextended")
    color = models.ForeignKey(Color)

解决方法

您可以覆盖UserSerializer的__init __()方法以更改必填字段的默认错误消息.

我们将遍历序列化程序的字段并更改所需密钥的默认error_messagesvalue的值.

class UserSerializer(SetCustomErrorMessagesMixin,serializers.ModelSerializer):

    def __init__(self,**kwargs):
        super(UserSerializer,**kwargs) # call the super() 
        for field in self.fields: # iterate over the serializer fields
            self.fields[field].error_messages['required'] = '%s field is required'%field # set the custom error message

    ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读