web-dev-qa-db-ja.com

Djangoモデルに電話番号を保存する最良の方法は何ですか

私は次のようにmodelに電話番号を保存しています:

phone_number = models.CharField(max_length=12)

ユーザーは電話番号を入力し、SMS Authenticationに電話番号を使用します。このアプリケーションはグローバルに使用されます。そのため、国コードも必要になります。 CharFieldは電話番号を保存する良い方法ですか?また、電話番号を検証するにはどうすればよいですか?

前もって感謝します。

112
pynovice

あなたは実際に国際的に標準化されたフォーマットを見るかもしれません E.164例えばTwilioが推奨 (SMSを送信するためのサービスとAPIを持っているか、 RESTリクエストを介した電話)。

これは、特に国際電話番号を使用している場合に、電話番号を保存する最も一般的な方法です。

1. PhoneNumberFieldによる電話

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

2.正規表現による電話

モデルに関する注意事項: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
244
erewok

Django-phonenumber-fieldを使用: https://github.com/stefanfoulis/Django-phonenumber-field

pip install Django-phonenumber-field
45
rgenito

モデルの電話フィールドにはCharFieldを使用し、フォーム検証にはlocalflavorアプリを使用します。

https://docs.djangoproject.com/en/1.7/topics/localflavor/

6
nicorellius

検証は簡単です。テキストを入力するための小さなコードをテキストで入力します。CharFieldはそれを保存するのに最適な方法です。電話番号の正規化についてはあまり心配しません。

2
U2EF1

それはすべて、あなたが電話番号として理解するものに依存します。電話番号は国固有です。いくつかの国のlocalflavorsパッケージには、独自の「電話番号フィールド」が含まれています。そのため、国ごとに問題がない場合は、localflavorパッケージを確認する必要があります(米国の場合はclass us.models.PhoneNumberFieldなど)

それ以外の場合は、ローカルフレーバーを調べて、すべての国の最大の長さを取得できます。 Localflavorには、電話番号を検証するために国コードと組み合わせて使用​​できるフォームフィールドもあります。

1
esauro

使用するものについて説明します。

検証:文字列に5桁以上が含まれています。

クリーニング:数字以外の記号をすべて削除し、dbのみの数字で書き込みます。私の国(ロシア)では誰もが10桁の電話番号を持っているので、私は幸運です。したがって、dbに格納するのは10ディットのみです。複数の国のアプリケーションを作成している場合は、包括的な検証を行う必要があります。

レンダリング:カスタムテンプレートタグを作成して、テンプレートで適切にレンダリングします。または、画像のようにレンダリングすることもできます-SMSスパムを防ぐ方が安全です。

検証にはDjango-phonenumber-fieldを使用します: https://github.com/stefanfoulis/Django-phonenumber-field

pip install Django-phonenumber-field
pip install phonenumbers
0
surya bista