Você pode realmente procurar o formato internacionalmente padronizado E.164 , recomendado pelo Twilio, por exemplo (que possui um serviço e uma API para enviar SMS ou telefonemas através de solicitações REST).
É provável que seja a maneira mais universal de armazenar números de telefone, principalmente se você trabalha com números internacionais.
1. Telefone por PhoneNumberField
Você pode usar a phonenumber_field
biblioteca. É o porto da biblioteca libphonenumber do Google, que possibilita o processamento de números de telefone do Android
https://github.com/stefanfoulis/django-phonenumber-field
No modelo:
from phonenumber_field.modelfields import PhoneNumberField
class Client(models.Model, Importable):
phone = PhoneNumberField(null=False, blank=False, unique=True)
No formulário:
from phonenumber_field.formfields import PhoneNumberField
class ClientForm(forms.Form):
phone = PhoneNumberField()
Obter telefone como string do campo de objeto:
client.phone.as_e164
Normolize a sequência telefônica (para testes e outras equipes):
from phonenumber_field.phonenumber import PhoneNumber
phone = PhoneNumber.from_string(phone_number=raw_phone, region='RU').as_e164
2. Telefone por regexp
Uma observação para o seu modelo: os números E.164 têm um comprimento máximo de 15 caracteres.
Para validar, você pode empregar alguma combinação de formatação e tentar entrar em contato com o número imediatamente para verificar.
Acredito que usei algo como o seguinte no meu projeto django:
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."))
EDITAR
Parece que este post foi útil para algumas pessoas, e parece valer a pena integrar o comentário abaixo em uma resposta mais completa. De acordo com o jpotter6 , você também pode fazer o seguinte em seus modelos:
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