1. ホーム
  2. django

[解決済み] Django のモデルで電話番号を保存する最良の方法は何ですか?

2022-04-16 04:10:26

質問

に電話番号を保存しています。 model このように

phone_number = models.CharField(max_length=12)

ユーザーが電話番号を入力すると、私はその電話番号を使って SMS Authentication このアプリケーションは全世界で使用されます。そのため、国番号も必要です。そうですね CharField は、電話番号を格納する良い方法ですか?また、電話番号の検証はどのように行えばよいのでしょうか?

どのように解決するのですか?

国際的に標準化された形式を実際に調べてみるとよいでしょう。 E.164 , Twilioが推奨する例 (RESTリクエストでSMSや電話を送信するサービスとAPIを持っている)。

特に国際的な電話番号を扱う場合は、これが最も普遍的な電話番号の保存方法だと思われます。

1. PhoneNumberFieldによる電話

を使用することができます。 phonenumber_field ライブラリです。これはGoogleのlibphonenumberライブラリの移植で、Androidの電話番号処理に貢献しています。 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."))


EDIT

この投稿が何人かの人に役に立ったようなので、以下のコメントを統合して、より本格的な回答にする価値があるように思います。以下の通りです。 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