Python 我的函数在django项目中不起作用
我目前正在尝试使用以下文本字段(email、country和phone number)以json或api视图格式返回数据,但是我还有两个验证函数来验证email和phone number字段中的值,这需要get()方法,并使用它将文本作为参数传递。我不确定这两个验证功能是否正常工作,因为当我输入一封无效电子邮件时,它仍然被接受为有效数据。请告诉我我做错了什么,以及应该对我的当前代码做什么更改Python 我的函数在django项目中不起作用,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,我目前正在尝试使用以下文本字段(email、country和phone number)以json或api视图格式返回数据,但是我还有两个验证函数来验证email和phone number字段中的值,这需要get()方法,并使用它将文本作为参数传递。我不确定这两个验证功能是否正常工作,因为当我输入一封无效电子邮件时,它仍然被接受为有效数据。请告诉我我做错了什么,以及应该对我的当前代码做什么更改 /* serializers.py */ import re import phonenumbers f
/* serializers.py */
import re
import phonenumbers
from rest_framework import serializers
from .models import validation
from phonenumbers import carrier
from validate_email import validate_email
class validationSerializer(serializers.ModelSerializer):
class Meta:
model = validation
fields = '__all__'
def clean_email(self):
email = self.cleaned_data.get("email")
if not validate_email(email, check_mx=True, verify=True):
raise serializers.ValidationError("Invalid email")
return email
def clean_phone_number(self):
phone_number = self.cleaned_data.get("phone_number")
clean_number = re.sub("[^0-9&^+]", "", phone_number)
alpha_2 = self.cleaned_data.get("country")
z = phonenumbers.parse(clean_number, "%s" % (alpha_2))
if len(clean_number) > 15 or len(clean_number) < 3:
raise serializers.ValidationError(
"Number cannot be more than 15 or less than 3")
if not phonenumbers.is_valid_number(z):
raise serializers.ValidationError(
"Number not correct format or non-existent")
if carrier.name_for_number(z, "en") == '':
raise serializers.ValidationError("Please enter a mobile number")
return phonenumbers.format_number(
z, phonenumbers.PhoneNumberFormat.E164)
/* models.py */
from django.db import models
class validation(models.Model):
email = models.EmailField()
country = models.CharField(max_length=2)
phone_number = models.CharField(max_length=100)
def __str__(self):
return self.email
/*serializers.py*/
进口稀土
导入电话号码
从rest_框架导入序列化程序
从。模型导入验证
从电话号码导入运营商
从验证电子邮件导入验证电子邮件
类validationSerializer(serializers.ModelSerializer):
类元:
模型=验证
字段='\uuuu所有\uuuu'
def clean_电子邮件(自我):
email=self.cleanned_data.get(“email”)
如果未验证电子邮件(电子邮件,检查\u mx=True,验证=True):
引发序列化程序。ValidationError(“无效电子邮件”)
返回电子邮件
def清洁电话号码(自身):
phone\u number=self.cleaned\u data.get(“phone\u number”)
clean_number=re.sub(“[^0-9&^+]”,电话号码)
alpha_2=自清理_数据获取(“国家”)
z=phonenumbers.parse(clean_number,“%s”%(alpha_2))
如果len(清洁编号)>15或len(清洁编号)<3:
引发序列化程序。验证错误(
“数字不能大于15或小于3”)
如果不是电话号码。电话号码是否有效(z):
引发序列化程序。验证错误(
“编号格式不正确或不存在”)
如果承运商名称为编号(z,“en”)='':
引发序列化程序。ValidationError(“请输入手机号码”)
返回phonenumbers.format\u number(
z、 phonenumbers.PhoneNumberFormat.E164)
/*models.py*/
从django.db导入模型
类验证(models.Model):
email=models.EmailField()
国家/地区=型号.CharField(最大长度=2)
电话号码=models.CharField(最大长度=100)
定义(自我):
返回self.email
如果您的if语句没有从函数返回,它应该给出一个validationerror,但之后它仍然会返回电话号码
可以在if语句中返回函数,也可以使用以下结构:
if not phonenumbers.is_valid_number(z):
raise serializers.ValidationError(
"Number not correct format or non-existent")
elif carrier.name_for_number(z, "en") == '':
raise serializers.ValidationError("Please enter a mobile number")
else:
return phonenumbers.format_number(
z, phonenumbers.PhoneNumberFormat.E164)
Clean用于模型,validate用于序列化程序。因此,您必须使用validate而不是clean。根据本例格式化代码。此外,使用自验证的\u数据代替自清理的\u数据
from rest_framework import serializers
class EventSerializer(serializers.Serializer):
description = serializers.CharField(max_length=100)
start = serializers.DateTimeField()
finish = serializers.DateTimeField()
def validate(self, data):
"""
Check that start is before finish.
"""
if data['start'] > data['finish']:
raise serializers.ValidationError("finish must occur after start")
return data
def validate_description(self, value):
"""
Check that event is related to django.
"""
if 'django' not in value.lower():
raise serializers.ValidationError("It is not a django event")
return data
在您的情况下,您可以像这样重写电子邮件验证
def validate_email(self):
email = self.validated_data.get("email")
if not self.validate_email(email, check_mx=True, verify=True):
raise serializers.ValidationError("Invalid email")
return email
也许您正在寻找,您可以创建一个验证函数,并在kwargs
validators=
链接中的一部分:
def validate_even(value):
if value % 2 != 0:
raise ValidationError(
_('%(value)s is not an even number'),
params={'value': value},
)
-----------
even_field = models.IntegerField(validators=[validate_even])
因此,如果我改为将email和phone number字段放在serializers.py中,并将函数名更改为以validate_(某物)开头,它应该可以工作?请查看更新的解决方案。您可以参考这里,然后我应该在哪里包括我的电子邮件和电话号码验证,它使用从PyPI安装的软件包?我需要从用户输入的内容中获取值,然后进行验证。我认为validate_email方法没有遗漏任何内容。我是否必须注册序列化程序,因为它包含所有字段而不是models.py,这是否意味着我将不再使用models.py?我根据结构重写了代码,但在添加时管理员网站上的新用户,验证仍然不起作用。发布
validate\u电子邮件的逻辑