如何更改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 ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |