1

表格.py

class UserCreateProfileForm(forms.ModelForm):
    fields = ['phone_daytime', 'phone_mobile']

    def clean(self):
        cd=self.cleaned_data
        validate_integer(cd.get('phone_daytime', None))
        validate_integer(cd.get('phone_mobile', None))
        return cd

     def validate_integer(phone_daytime,phone_mobile):
    try:
        int(phone_daytime,phone_mobile)
    except (ValueError, TypeError):
        raise ValidationError('Phone number must be number')

我想用两个电话号码字段验证表单。

上面的一个不起作用,没有抛出任何错误但不起作用。

该字段不应接受字母、特殊字符和空白也允许。如何进行此验证。

谢谢

4

2 回答 2

0

为了验证电话号码,这是您应该采取的方法。

class UserCreateProfileForm(forms.ModelForm):
    fields = ['phone_daytime', 'phone_mobile']

    def clean(self):
        cd = self.cleaned_data
        validate_phonenumber(cd.get('phone_daytime', None))
        validate_phonenumber(cd.get('phone_mobile', None))
        return cd

    def validate_phonenumber(phone_number):
        for char in phone_number:
            if not char.isdigit():
                raise ValidationError("Phone number must be number")

您在代码中遇到的错误是您尝试执行的int(phone_daytime, phone_mobile). 这是不正确的,这会引发TypeError(). 此外,您所做的还0从电话号码中删除了前导。现在这还不错,因为您无论如何都没有使用解析的数字,但很高兴知道。

于 2013-05-14T15:15:28.293 回答
0

编辑:是的,我肯定会使用它。https://docs.djangoproject.com/en/1.5/ref/contrib/localflavor/许多国家/地区已经实施了电话字段,当然你也是。

对于印度:

验证数据是有效的印度电话号码,包括 STD 代码。它被标准化为 0XXX-XXXXXXX 或 0XXX XXXXXXX 格式。第一个字符串是 STD 代码,它是一个“0”,后跟 2-4 位数字。如果 STD 码为 3 位,则第二个字符串为 8 位,如果 STD 码为 4 位,则为 7 位,如果 STD 码为 5 位,则为 6 位。第二个字符串将以 1 到 6 之间的数字开头。分隔符是空格或连字符。

import re

phone_digits_re = re.compile(r"""
(
(?P<std_code> # the std-code group
^0 # all std-codes start with 0
(
(?P<twodigit>\d{2}) | # either two, three or four digits
(?P<threedigit>\d{3}) | # following the 0
(?P<fourdigit>\d{4})
)
)
[-\s] # space or -
(?P<phone_no> # the phone number group
[1-6] # first digit of phone number
(
(?(twodigit)\d{7}) | # 7 more phone digits for 3 digit stdcode
(?(threedigit)\d{6}) | # 6 more phone digits for 4 digit stdcode
(?(fourdigit)\d{5}) # 5 more phone digits for 5 digit stdcode
)
)
)$""", re.VERBOSE)

取自这里

在您的模型中:

from django.core.validators import RegexValidator

class YourProfileModel(Model):
    phone_field = CharField(max_lenght=12, validators=[RegexValidator(regex=phone_digits_re)])
于 2013-05-14T14:36:46.483 回答