First, add phonenumber_field to the list of the installed apps in your settings.py file: INSTALLED_APPS = [ ... 'phonenumber_field', ... ] Internally, PhoneNumberField is based upon CharField and by default represents the number as a string of an international phonenumber in the database (e.g '+41524204242').
IntegerField is a integer number represented in Python by a int instance. This field is generally used to store integer numbers in the database. The default form widget for this field is a NumberInput when localize is False or TextInput otherwise.
TimeStampedModel - An Abstract Base Class model that provides self-managed created and modified fields.
You might actually look into the internationally standardized format E.164, recommended by Twilio for example (who have a service and an API for sending SMS or phone-calls via REST requests).
This is likely to be the most universal way to store phone numbers, in particular if you have international numbers work with.
You can use phonenumber_field
library. It is port of Google's libphonenumber library, which powers Android's phone number handling
https://github.com/stefanfoulis/django-phonenumber-field
In model:
from phonenumber_field.modelfields import PhoneNumberField
class Client(models.Model, Importable):
phone = PhoneNumberField(null=False, blank=False, unique=True)
In form:
from phonenumber_field.formfields import PhoneNumberField
class ClientForm(forms.Form):
phone = PhoneNumberField()
Get phone as string from object field:
client.phone.as_e164
Normolize phone string (for tests and other staff):
from phonenumber_field.phonenumber import PhoneNumber
phone = PhoneNumber.from_string(phone_number=raw_phone, region='RU').as_e164
One note for your model: E.164 numbers have a max character length of 15.
To validate, you can employ some combination of formatting and then attempting to contact the number immediately to verify.
I believe I used something like the following on my django project:
class ReceiverForm(forms.ModelForm):
phone_number = forms.RegexField(regex=r'^\+?1?\d{9,15}$',
error_message = ("Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed."))
EDIT
It appears that this post has been useful to some folks, and it seems worth it to integrate the comment below into a more full-fledged answer. As per jpotter6, you can do something like the following on your models as well:
models.py:
from django.core.validators import RegexValidator
class PhoneModel(models.Model):
...
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
phone_number = models.CharField(validators=[phone_regex], max_length=17, blank=True) # validators should be a list
Use django-phonenumber-field: https://github.com/stefanfoulis/django-phonenumber-field
pip install django-phonenumber-field
Use CharField
for phone field in the model and the localflavor
app for form validation:
https://docs.djangoproject.com/en/1.7/topics/localflavor/
UPDATE (29021-12-07). Looks like LocalFlavor is no longer part of Django:
https://pypi.org/project/django-localflavor/
This solution worked for me:
First install django-phone-field
command: pip install django-phone-field
then on models.py
from phone_field import PhoneField
...
class Client(models.Model):
...
phone_number = PhoneField(blank=True, help_text='Contact phone number')
and on settings.py
INSTALLED_APPS = [...,
'phone_field'
]
It looks like this in the end
Validation is easy, text them a little code to type in. A CharField is a great way to store it. I wouldn't worry too much about canonicalizing phone numbers.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With