【问题标题】:integer validation in django not workingdjango中的整数验证不起作用
【发布时间】:2013-05-14 14:33:09
【问题描述】:

forms.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')

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

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

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

谢谢

【问题讨论】:

  • 你的validate_integer()是如何实现的?
  • validate_integer 是内置函数吗?
  • - 怎么样?不能在电话号码中吗?
  • @limelights validate_integer() 方法更新有问题

标签: django django-forms django-templates


【解决方案1】:

要验证电话号码,这是您应该采用的方法。

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。现在这并没有那么糟糕,因为无论如何您都没有使用解析后的数字,但很高兴知道。

【讨论】:

  • 我收到此错误“未定义全局名称'validate_phonenumber'”
【解决方案2】:

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

对于印度:

验证数据是有效的印度电话号码,包括 性病代码。它被标准化为 0XXX-XXXXXXX 或 0XXX XXXXXXX 格式。这 第一个字符串是 STD 代码,它是一个“0”,后跟 2-4 位数字。 如果 STD 码是 3 位,则第二个字符串是 8 位,如果是 7 位 STD 代码为 4 位,如果 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)

取自here

在您的模型中:

from django.core.validators import RegexValidator

class YourProfileModel(Model):
    phone_field = CharField(max_lenght=12, validators=[RegexValidator(regex=phone_digits_re)])

【讨论】:

  • 但他们甚至不想添加验证器。
  • @karthikr 那是文档示例,仍在编辑我的答案。谢谢
  • 我明白了。但是没有内置的 validate_integer 验证器。你必须实施它。猜猜这已经完成了——那就是 OP 没有收到任何错误
  • 当然,但他已经在他的代码中使用了一个函数。看来他已经有了。
  • 是的,你提到的那个链接很有用,但是现在我只需要验证int,怎么做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2015-10-12
  • 2013-12-02
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多