[英]Django serializers: validate function not called
I am trying override validate()
function to be called by serializers.is_valid()
, but its not getting called.我正在尝试覆盖由
serializers.is_valid()
调用的validate()
函数,但它没有被调用。
serializer.py序列化程序.py
class LoginSerializer(serializers.Serializer):
email = serializers.EmailField(max_length=255,required=True)
password = serializers.CharField(max_length=128,required=True)
def validate(self,data):
'''
Check for invalid email.
& blank email and password.
'''
print 'hey i am in login'
if data['email'] is '':
raise serializers.ValidationError("Email cannot be empty.")
if data['password'] is '':
raise serializers.ValidationError("Password cannot be empty.")
try:
validate_email(data['email'])
except ValidationError:
raise serializers.ValidationError("The email is not a valid email address.")
return data
views.py视图.py
class LoginAPI(APIView):
permission_classes = (permissions.AllowAny,)
serializer = LoginSerializer
def post(self, request):
data = self.serializer(data=request.data)
if data.is_valid():
#do something
else:
return Response(data.errors,status=status.HTTP_400_BAD_REQUEST)
while i call is_valid()
, the print statement inside validate()
function is not getting executed.当我调用
is_valid()
, validate()
函数中的打印语句没有被执行。 what am i doing wrong?我做错了什么?
I think you are not getting any print
statements because validate
function is not being called.我认为您没有收到任何
print
语句,因为没有调用validate
函数。
If there is an error in one of the fields say email
, validate
function won't be called but since you didn't pass raise_exception=True
as argument in is_valid
you are not getting those errors and you assume that is_valid
is not running.如果其中一个字段中有错误,例如
email
,则不会调用validate
函数,但由于您没有将raise_exception=True
作为is_valid
参数is_valid
您不会收到这些错误,并且您假设is_valid
没有运行。
You could write the post
method as following:您可以将
post
方法编写如下:
def post(self, request):
serializer = self.serializer(data=request.data)
# following will automatically raise an exception if the serialize data is not valid
serializer.is_valid(raise_exception=True)
# do something if the serializer is valid
UPDATE : If you want to raise specific message after validating different fields, you could create a method validate_<fieldname>
in serializer:更新:如果您想在验证不同字段后引发特定消息,您可以在序列化程序中创建一个方法
validate_<fieldname>
:
def validate_email(self, value):
if value == '':
raise serializers.ValidationError("Email cannot be empty.")
try:
validate_email(value)
except ValidationError:
raise serializers.ValidationError("The email is not a valid email address.")
return value
I had the same error.我有同样的错误。 Try to go with
尝试去
def run_validation(self, data):
...
instead of而不是
def validation(self, data):
...
this should work!这应该工作!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.