2013-10-02 7 views
71

Я хранящую номер телефона в model, как это:Какой самый лучший способ сохранить телефонный номер в модели Django

phone_number = models.CharField(max_length=12) 

Пользователь будет ввести номер телефона и я хотел бы использовать телефонный номер для SMS Authentication Это приложение будет использоваться глобально. Поэтому мне также нужен код страны. Есть CharField является хорошим способом для хранения номера телефона? И, как я могу подтвердить номер телефона?

Заранее благодарен

+1

Там в большое предложение здесь: http://stackoverflow.com/a/1245990/207791 –

ответ

161

Возможно, вы действительно посмотрите на международно стандартизованный формат E.164, recommended by Twilio for example (у кого есть служба и API для отправки SMS или телефонных звонков через запросы REST).

Это, скорее всего, самый универсальный способ хранения телефонных номеров, в частности, если у вас есть международные номера.

Одно примечания для вашей модели: номера E.164 имеют максимальную длину символьного 15.

Для проверки, вы можете использовать некоторую комбинацию форматирования, а затем пытаетесь немедленно связаться номером для проверки.

Я считаю, что я что-то вроде следующего на моем Джанго проекте:

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

Похоже, что этот пост был полезным для некоторых людей, и это, кажется, стоит это интегрировать комментарий ниже в более полноценный ответ. В соответствии с jpotter6, вы можете сделать что-то вроде следующего на ваших моделях:

модели.ру:

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 
+15

Возможно, было бы полезно показать, как это сделать на модели. phone_regex = RegexValidator (regex = r '^ \ +? 1? \ D {9,15} $', message = "Номер телефона должен быть введен в формате:« +999999999 ». Допускается до 15 цифр. «) phone_number = models.CharField (валидаторы = phone_regex, пустой = True) – jpotts18

+0

@ jpotter6 Ваш комментарий будет большой дополнительный ответ на этот вопрос. – par

+11

Не забудьте добавить 'max_length = 15' в models.CharField – Esteban

1

Все зависит от того, что вы понимаете как номер телефона. Номера телефонов специфичны для страны. Пакеты localflavors для нескольких стран содержат свое собственное поле «номер телефона». Так что, если вы в порядке, то вам следует взглянуть на пакет localflavor (class us.models.PhoneNumberField для американского футляра и т. Д.)

В противном случае вы можете осмотреть локальные злоумышленники, чтобы получить максимальную длину для всех стран. Localflavor также имеет поля форм, которые вы могли бы использовать в сочетании с кодом страны для проверки номера телефона.

+0

Хм Да, я обнаружил, что в то время как я сделал исследование. Можете ли вы привести пример того, как использовать его в форме. – pynovice

1

Я буду описывать, что я использую:

Validation: строка содержит более 5 цифр.

Очистка: удаление всех символов без цифр, запись только в числах. Мне повезло, потому что в моей стране (Россия) у всех есть номера телефонов с 10 цифрами. Поэтому я храню в db всего 10 децитов. Если вы пишете многостраничное приложение, вы должны сделать всестороннюю проверку.

Рендеринг: я пишу специальный тег шаблона, чтобы сделать его в шаблоне красиво. Или даже сделать его как изображение - безопаснее предотвращать спам-спам.

2

Проверка проста, назовите их небольшим кодом для ввода. CharField - отличный способ его сохранить. Я не стал бы слишком беспокоиться о канонизации номеров телефонов.

Смежные вопросы