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

时间:2019-10-04 03:58:03

标签: python django rest django-rest-framework

我目前正在尝试使用以下文本字段(电子邮件,国家/地区和电话号码)以json或api视图格式返回数据,但是我也有2个验证功能来验证电子邮件和电话号码字段中的值,需要使用get()方法,并使用它来将文本作为参数传递。我不确定这两个验证功能是否正常工作,就像我输入无效的电子邮件时一样,它仍被视为有效数据。请告诉我我做错了什么,应该对当前代码进行哪些更改。

npm run build

3 个答案:

答案 0 :(得分:0)

您的if语句未从函数返回,则应给出验证错误,但此后仍将返回电话号码。

您可以在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)

答案 1 :(得分:0)

Clean与模型一起使用,validate与串行器一起使用。因此,您必须使用验证而不是清除。根据此示例格式化代码。另外,使用self.validated_data代替self.cleaned_data。

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

答案 2 :(得分:0)

也许您正在寻找Validators,您可以创建一个验证函数并在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])