私は次のようにmodel
に電話番号を保存しています:
phone_number = models.CharField(max_length=12)
ユーザーは電話番号を入力し、SMS Authentication
に電話番号を使用します。このアプリケーションはグローバルに使用されます。そのため、国コードも必要になります。 CharField
は電話番号を保存する良い方法ですか?また、電話番号を検証するにはどうすればよいですか?
前もって感謝します。
あなたは実際に国際的に標準化されたフォーマットを見るかもしれません E.164 、 例えばTwilioが推奨 (SMSを送信するためのサービスとAPIを持っているか、 RESTリクエストを介した電話)。
これは、特に国際電話番号を使用している場合に、電話番号を保存する最も一般的な方法です。
phonenumber_field
ライブラリを使用できます。これは、Androidの電話番号の処理を強化するGoogleのlibphonenumberライブラリの移植版です https://github.com/stefanfoulis/Django-phonenumber-field
モデル内:
from phonenumber_field.modelfields import PhoneNumberField
class Client(models.Model, Importable):
phone = PhoneNumberField(null=False, blank=False, unique=True)
フォームで:
from phonenumber_field.formfields import PhoneNumberField
class ClientForm(forms.Form):
phone = PhoneNumberField()
オブジェクトフィールドから文字列として電話を取得:
client.phone.as_e164
電話文字列をノルモライズ(テストおよびその他のスタッフ用):
from phonenumber_field.phonenumber import PhoneNumber
phone = PhoneNumber.from_string(phone_number=raw_phone, region='RU').as_e164
モデルに関する注意事項:E.164番号の最大文字長は15です。
検証するために、フォーマットの組み合わせを採用し、すぐに番号に連絡して検証を試みることができます。
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."))
編集
この投稿は一部の人々にとって有用であると思われ、以下のコメントをより本格的な回答に統合する価値があると思われます。 jpotter6 に従って、モデルでも次のようなことができます。
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
Django-phonenumber-fieldを使用: https://github.com/stefanfoulis/Django-phonenumber-field
pip install Django-phonenumber-field
モデルの電話フィールドにはCharField
を使用し、フォーム検証にはlocalflavor
アプリを使用します。
検証は簡単です。テキストを入力するための小さなコードをテキストで入力します。CharFieldはそれを保存するのに最適な方法です。電話番号の正規化についてはあまり心配しません。
それはすべて、あなたが電話番号として理解するものに依存します。電話番号は国固有です。いくつかの国のlocalflavorsパッケージには、独自の「電話番号フィールド」が含まれています。そのため、国ごとに問題がない場合は、localflavorパッケージを確認する必要があります(米国の場合はclass us.models.PhoneNumberField
など)
それ以外の場合は、ローカルフレーバーを調べて、すべての国の最大の長さを取得できます。 Localflavorには、電話番号を検証するために国コードと組み合わせて使用できるフォームフィールドもあります。
使用するものについて説明します。
検証:文字列に5桁以上が含まれています。
クリーニング:数字以外の記号をすべて削除し、dbのみの数字で書き込みます。私の国(ロシア)では誰もが10桁の電話番号を持っているので、私は幸運です。したがって、dbに格納するのは10ディットのみです。複数の国のアプリケーションを作成している場合は、包括的な検証を行う必要があります。
レンダリング:カスタムテンプレートタグを作成して、テンプレートで適切にレンダリングします。または、画像のようにレンダリングすることもできます-SMSスパムを防ぐ方が安全です。
検証にはDjango-phonenumber-fieldを使用します: https://github.com/stefanfoulis/Django-phonenumber-field
pip install Django-phonenumber-field
pip install phonenumbers