Login

Smarter USPhoneNumberField

Author:
clamothe
Posted:
August 9, 2008
Language:
Python
Version:
.96
Tags:
forms validation field phone
Score:
1 (after 1 ratings)

The original USPhoneNumberField only validates xxx-xxx-xxxx values.

This field validates...

(xxx) xxx xxxx xxx-xxx-xxxx (xxx)-xxx-xxxx many others.

Explanation of the regular expression:

  1. Accepts either (xxx) or xxx at the start of the value.
  2. Allows for any amount of dashes and spaces (including none) before the next set of digits.
  3. Accepts 3 digits
  4. Allows for any amount of dashes and spaces (including none) before the next set of digits.
  5. Accepts 4 digits, finishing the value.

This field saves in the same format that the original USPhoneNumberField does (xxx-xxx-xxxx).

Enjoy!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# stdlib
import re

# django
from django.forms.fields import EMPTY_VALUES, Field
from django.forms import ValidationError
from django.utils.encoding import smart_unicode


__all__ = ('phone_digits_re', 'USPhoneNumberField')
phone_digits_re = re.compile(r'^((\((?P<areacode_1>\d{3})\))|(?P<areacode_2>\d{3}))[ \-]*(?P<first>\d{3})[ \-]*(?P<last>\d{4})$')

class USPhoneNumberField(Field):
    " A USPhoneNumberField that accepts a wide variety of valid phone number patterns. "
    default_error_messages = {
        'invalid': u'The phone number is invalid.',
    }

    def clean(self, value):
        super(USPhoneNumberField, self).clean(value)
        if value in EMPTY_VALUES:
            return u''
        
        m = phone_digits_re.match( smart_unicode(value) )
        if m:
            return u'%s-%s-%s' % (m.group('areacode_1') or m.group('areacode_2'), m.group('first'), m.group('last'))
        raise ValidationError(self.error_messages['invalid'])

More like this

  1. Improved Pickled Object Field by taavi223 5 years, 7 months ago
  2. keywords arguments parser for custom template tags by bruno 6 years, 2 months ago
  3. XhtmlDegraderMiddleware by dmh 7 years, 8 months ago
  4. FieldsetForm by Ciantic 7 years, 11 months ago
  5. Mod to allow simple_tag to access context by leaf 6 years, 6 months ago

Comments

middlelord (on September 21, 2011):

Hello I am trying to implement but where do I place this code? in the Models.py or views.py ? Thank you for the Code

#

Please login first before commenting.