Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我的函数在django项目中不起作用_Python_Django_Rest_Django Rest Framework - Fatal编程技术网

Python 我的函数在django项目中不起作用

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

我目前正在尝试使用以下文本字段(email、country和phone number)以json或api视图格式返回数据,但是我还有两个验证函数来验证email和phone number字段中的值,这需要get()方法,并使用它将文本作为参数传递。我不确定这两个验证功能是否正常工作,因为当我输入一封无效电子邮件时,它仍然被接受为有效数据。请告诉我我做错了什么,以及应该对我的当前代码做什么更改

/* 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电子邮件的逻辑