本記事の概要
完全に自分用のメモです。
phonenumbers
というパッケージを用いてdjangoアプリに電話番号入力フォームを実装していました。
電話番号には国内表記(090などで始まるいつものやつ)と国際表記(日本であれば+81といったような国コードを含むもの)がありますが、このパッケージを用いて実装されるフォームが国際コードを強制するものであり、そこに少し手こずったので、それも含めて残しておきます。
目次
- 導入
- フォームの作成
- 入力例
- テンプレートの表示例
- 国内表記に戻す方法
- 終わりに
導入
まずは必要なパッケージをインストールしていきます。
% pip3 install django-phonenumber-field
% pip3 install phonenumbers
インストールできたら、settings.py
に以下のように追記します。
INSTALLED_APPS = [
# ...中略...
"phonenumber_field",
# ...中略...
]
これで
from phonenumber_field.modelfields import PhoneNumberField
と記述することでそのモジュールではPhonenumberField
を扱うことができるようになります。
フォームの作成
それではフォームを作ります。
from phonenumber_field.modelfields import PhoneNumberField
class Shop(models.Model):
phonenumber = PhoneNumberField
class ShopForm(ModelForm):
class Meta:
model = Shop
fields = "__all__"
PhoneNumberField
のインポート以外は特に問題ないと思います。
入力例
電話番号は国コードをつけた状態で入力します。
日本の電話番号であれば、先頭の0を+81
に変換すればOKです(国コードをつけないとバリデーションエラーになります)。
これをそのままshop.phonenumber
で表示した場合、テンプレート上では+81
表記になります。
国内表記に戻す方法
+81
表記だと使い勝手が悪いので、国内表記に戻します。
手っ取り早い方法は、phonenumberオブジェクトのformat_number
メソッドを用いることです。
import phonenumbers
# ...中略...
natinal_phonenumber = phonenumbers.format_number(shop.phonenumber, phonenumbers.PhoneNumberFormat.NATIONAL)
第一引数のphonenmberオブジェクトを第二引数のフォーマットに従って変換しています。
NATIONA
が国内表記の意味で、この部分をINTERNATIONAL
にすれば国内→国際の変換も可能です。
あとはこれをテンプレートに渡すだけです。
ちなみに、この変換はテンプレートの{{}}
の中では行えないので気をつけましょう。
終わりに
以上がPhoneNumberField`の使い方でした。
しかし今更ですが、国際コードでの入力が必要ない場面では却って使いにくいですね・・・
国内ユーザーのみを考慮すれば良いのであれば、自分でバリデーションを設定した方が良いと思います。