【问题标题】:Integer field prefix zero not displaying整数字段前缀零不显示
【发布时间】:2013-07-30 08:00:20
【问题描述】:

forms.py

class PhoneForm(forms.ModelForm):         
    number1 = forms.IntegerField(required=False,error_messages={'invalid':'Enter a valid phone number'})
    number2 = forms.IntegerField(required=False,error_messages={'invalid':'Enter a valid phone number'})
    number3 = forms.IntegerField(required=False,error_messages={'invalid':'Enter a valid phone number'})
    class Meta:
        model = PhoneInfo
        fields = ['name1','number1','name2','number2','name3','number3','emergency','emergency_number']

models.py

class PhoneInfo(models.Model):    
    user = models.ForeignKey(User, null=True)
    name1 = models.CharField('Name', max_length=100, null=True, blank=True)
    number1 = models.CharField('Number',max_length=20, null=True, blank=True)
    name2 =  models.CharField('Name', max_length=100, null=True, blank=True)
    number2 = models.CharField('Number', max_length=20, null=True, blank=True)
    name3 = models.CharField('Name', max_length=100, null=True, blank=True)
    number3 = models.CharField('Number',max_length=20, null=True, blank=True)
    emergency = models.CharField('Emergency', max_length=100, null=True, blank=True)
    emergency_number = models.CharField('Emergency Number',max_length=20, null=True, blank=True)

nmber1、number2 和 number3 用于保存 11 位电话号码。我的问题是,如果我在保存 '0' 后将第一个数字添加为 '0',则会从表单字段中消失。我在之后添加“0”第一个数字正在保存和显示。问题在于:08854215452 第一个零在保存后消失。我想在保存带有 STD 代码的电话号码时也显示这一点。

Traceback:
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  101.                             request.path_info)
File "/usr/lib/python2.7/site-packages/django/core/urlresolvers.py" in resolve
  252.                     sub_match = pattern.resolve(new_path)
File "/usr/lib/python2.7/site-packages/django/core/urlresolvers.py" in resolve
  252.                     sub_match = pattern.resolve(new_path)
File "/usr/lib/python2.7/site-packages/django/core/urlresolvers.py" in resolve
  158.             return ResolverMatch(self.callback, args, kwargs, self.name)
File "/usr/lib/python2.7/site-packages/django/core/urlresolvers.py" in _get_callback
  164.             self._callback = get_callable(self._callback_str)
File "/usr/lib/python2.7/site-packages/django/utils/functional.py" in wrapper
  124.         result = func(*args)
File "/usr/lib/python2.7/site-packages/django/core/urlresolvers.py" in get_callable
  91.                 lookup_view = getattr(import_module(mod_name), func_name)
File "/usr/lib/python2.7/site-packages/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/root/Projects/ir_uploaded_copy/ir/setting/views.py" in <module>
  22. from setting.forms import *
File "/root/Projects/ir_uploaded_copy/ir/setting/forms.py" in <module>
  151. class PhoneForm(forms.ModelForm):
File "/root/Projects/ir_uploaded_copy/ir/setting/forms.py" in PhoneForm
  162.     emergency_number = forms.RegexField(regex=r'^\+?(\d{3}-?\d+{7})$', error_messages = {'invalid':'Enter a valid phone number'})
File "/usr/lib/python2.7/site-packages/django/forms/fields.py" in __init__
  437.             regex = re.compile(regex)
File "/usr/lib/python2.7/re.py" in compile
  190.     return _compile(pattern, flags)
File "/usr/lib/python2.7/re.py" in _compile
  245.         raise error, v # invalid expression

Exception Type: error at /setting/call/
Exception Value: multiple repeat

谢谢

【问题讨论】:

    标签: python django django-models django-forms django-templates


    【解决方案1】:

    切勿将电话号码保存为IntegerFields。您看到的行为对于任何编程语言中的整数都是正常的。

    >> myInt = 00001
    >> print myInt
    >> 1
    

    您应该将其存储为什么?您要么 a) 编写自己的字段,b) 选择 CharField 或选择 RegexField

    当谈到电话号码时,我通常更喜欢正则表达式字段如果您在世界的某个特定区域,例如瑞典会有以下正则表达式:

    phone_number = forms.RegexField(regex=r'^\+?(\d{3}-?\d+{7})$', error_messages = {'invalid_phonenumber': _("Not a valid Swedish phone number.")}
    

    【讨论】:

    • 是的,我在头顶写了这个正则表达式,它可能不是 100% 准确,抱歉! :) 请尝试r'\d+'。该正则表达式将抓取字符串中的所有数字,即。它不适用于连字符等。
    • Excellent,r'\d+' 工作正常,除了它采用整数和字符的组合,你能告诉我如何避免这种情况吗?(不采用纯字符)
    • 只使用r'\d+' 应该足以不带任何数字。
    • 但它正在接受像“15555534ssd”这样的数字和字符的组合。如果输入类似于“15555534ssd”,它正在接受并保存这些值。
    • 海风头,任何想法如何解决这个问题,我用一些正则格式检查并检查,仍然没有得到确切的。
    【解决方案2】:

    切勿将电话号码视为整数!始终使用 CharFields 并在必要时进行一些验证。请确保您不仅允许使用数字,还允许使用“-”、“”等。

    您的 ModelForm 可能如下所示:

    class PhoneForm(forms.ModelForm):
        class Meta:
            model = PhoneInfo
            fields = ['name1','number1','name2','number2','name3','number3','emergency','emergency_number']
    
        def clean_number1(self):
            n = self.cleaned_data.get('number1')
            for allowednondigit in '- ./':
                n.replace(allowednondigit, '')
            for char in n:
                if char not in '0123456789':
                    raise forms.ValidationError("Please only use digits, spaces, dots, slash and dash characters")
            return n
    

    这样,您可以在数据库中只存储数字(如果这是您真正想要的),同时仍然让您的用户按照他习惯的方式编写电话号码。

    【讨论】:

    • 感谢您的回答。但是,我想提一下n.replace(allowednondigit, '') 方法——对于我们想要允许一些额外字符的部分——将不起作用。 Here我已经发布了我的工作解决方案。
    【解决方案3】:

    由于这个确切的原因,我只见过存储在 models.CharFields 中的电话号码。

    不要在表单上使用forms.IntegerField,而是使用forms.CharField

    【讨论】:

      【解决方案4】:

      是 - 整数将忽略前导零。您可以将 0 设为隐式 (实际上它是隐式的)或将其转换为文本字段。

      【讨论】:

        【解决方案5】:

        我正在发布我的工作解决方案,基于 mawimawi's answer

        class PhoneForm(forms.ModelForm):
            class Meta:
                model = PhoneInfo
                fields = ['name1','number1','name2','number2','name3','number3','emergency','emergency_number']
        
            def clean_number1(self):
                n = self.cleaned_data.get('number1')
                allowed_characters = '0123456789- ./'
                for char in n:
                    if char not in allowed_characters:
                        raise forms.ValidationError("Please only use digits, spaces, dots, slash and dash characters")
                return n
        

        【讨论】:

          猜你喜欢
          • 2010-09-13
          • 1970-01-01
          • 2011-04-12
          • 2015-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-09
          相关资源
          最近更新 更多