Estou armazenando um número de telefone model
assim:
phone_number = models.CharField(max_length=12)
O usuário digitaria um número de telefone e eu usaria o número de telefone para SMS Authentication
Este aplicativo seria usado globalmente. Então, eu também precisaria do código do país. É CharField
uma boa maneira de armazenar o número de telefone? E como validar o número de telefone?
django
django-forms
django-validation
pynovice
fonte
fonte
Respostas:
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-fieldNo modelo:
No formulário:
Obter telefone como string do campo de objeto:
Normolize a sequência telefônica (para testes e outras equipes):
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:
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:
fonte
'^\+\d{8,15}$'
e,max_length=16
em seguida, para oCharField
.Use django-phonenumber-field: https://github.com/stefanfoulis/django-phonenumber-field
fonte
PHONENUMBER_DEFAULT_REGION = 'US'
as configurações, não permitirá que você insira nada que os usuários dos Estados Unidos reconheçam como um número de telefone. Mesmo assim, este pacote não será exibido como um número de telefone. . . Tenho certeza de que há uma configuração que ainda não encontrei!pip install django-phone-field
pip install django-phonenumber-field[phonenumberslite]
que não inclui os metadados de geocodificação, operadora e fuso horárioUse
CharField
para o campo de telefone no modelo e olocalflavor
aplicativo para validação de formulário:https://docs.djangoproject.com/en/1.7/topics/localflavor/
fonte
A validação é fácil, digite um pequeno código para digitar. Um CharField é uma ótima maneira de armazená-lo. Eu não me preocuparia muito em canonizar números de telefone.
fonte
Tudo depende do que você entende como número de telefone. Os números de telefone são específicos do país. Os pacotes sabores locais para vários países contêm seu próprio "campo de número de telefone". Portanto, se você está bem, sendo específico do país, consulte o pacote de sabores locais (
class us.models.PhoneNumberField
no caso dos EUA, etc.)Caso contrário, você pode inspecionar os sabores locais para obter o comprimento máximo para todos os países. O Localflavor também possui campos de formulários que você pode usar em conjunto com o código do país para validar o número de telefone.
fonte
Vou descrever o que eu uso:
Validação: string contém mais de 5 dígitos.
Limpeza: removendo todos os símbolos que não sejam dígitos, escreva apenas em números db. Tenho sorte, porque no meu país (Rússia) todo mundo tem números de telefone com 10 dígitos. Então eu guardo no db apenas 10 diits. Se você estiver escrevendo um aplicativo para vários países, faça uma validação abrangente.
Renderização: escrevo uma tag de modelo personalizada para renderizá-la perfeitamente no modelo. Ou até mesmo renderizá-lo como uma imagem - é mais seguro evitar spam sms.
fonte
Outros mencionados
django-phonenumber-field
. Para obter o formato de exibição como você quer você precisa definirPHONENUMBER_DEFAULT_FORMAT
configuração para"E164"
,"INTERNATIONAL"
,"NATIONAL"
ou"RFC3966"
, no entanto você quer que ele exibida. Veja a fonte do GitHub .fonte