185

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

phone_number = models.CharField(max_length=12)

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

4

9 に答える 9

372

たとえば、Twilio が推奨する国際的に標準化された形式E.164を実際に検討することもできます(REST 要求を介して SMS または電話を送信するためのサービスと API を持っています)。

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

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.正規表現による電話

モデルに関する 1 つの注意: 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
于 2013-10-02T06:49:01.273 に答える
61

django-phonenumber-field を使用します: https://github.com/stefanfoulis/django-phonenumber-field

pip install django-phonenumber-field
于 2014-03-19T06:02:14.967 に答える
8

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

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

更新(29021-12-07)。LocalFlavor は Django の一部ではなくなったようです:

https://pypi.org/project/django-localflavor/

于 2014-12-17T20:34:32.260 に答える
6

この解決策は私のために働いた:

最初にdjango-phone-fieldをインストールします

command: pip install django-phone-field

次にmodels.pyで

from phone_field import PhoneField
...

class Client(models.Model):
    ...
    phone_number = PhoneField(blank=True, help_text='Contact phone number')

そしてsettings.pyで

INSTALLED_APPS = [...,
                  'phone_field'
]

最終的にはこんな感じ

フォーム内の電話

于 2020-10-29T01:50:11.787 に答える
1

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

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

于 2013-10-02T06:24:49.933 に答える