2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

メモ〜phonenumber_fieldの値をテンプレート上で国内表示に戻す

Posted at

本記事の概要

完全に自分用のメモです。

phonenumbersというパッケージを用いてdjangoアプリに電話番号入力フォームを実装していました。

電話番号には国内表記(090などで始まるいつものやつ)と国際表記(日本であれば+81といったような国コードを含むもの)がありますが、このパッケージを用いて実装されるフォームが国際コードを強制するものであり、そこに少し手こずったので、それも含めて残しておきます。

目次

  • 導入
  • フォームの作成
  • 入力例
  • テンプレートの表示例
  • 国内表記に戻す方法
  • 終わりに

導入

まずは必要なパッケージをインストールしていきます。

% pip3 install django-phonenumber-field
% pip3 install phonenumbers

インストールできたら、settings.pyに以下のように追記します。

settings.py
INSTALLED_APPS = [
  # ...中略...
  "phonenumber_field",
  # ...中略...
]

これで

from phonenumber_field.modelfields import PhoneNumberField

と記述することでそのモジュールではPhonenumberFieldを扱うことができるようになります。

フォームの作成

それではフォームを作ります。

models.py
from phonenumber_field.modelfields import PhoneNumberField
class Shop(models.Model):
  phonenumber = PhoneNumberField
forms.py
class ShopForm(ModelForm):
  class Meta:
    model = Shop
    fields = "__all__"

PhoneNumberFieldのインポート以外は特に問題ないと思います。

入力例

電話番号は国コードをつけた状態で入力します。

日本の電話番号であれば、先頭の0を+81に変換すればOKです(国コードをつけないとバリデーションエラーになります)。

Image from Gyazo

これをそのままshop.phonenumberで表示した場合、テンプレート上では+81表記になります。

国内表記に戻す方法

+81表記だと使い勝手が悪いので、国内表記に戻します。

手っ取り早い方法は、phonenumberオブジェクトのformat_numberメソッドを用いることです。

import phonenumbers
# ...中略...
natinal_phonenumber = phonenumbers.format_number(shop.phonenumber, phonenumbers.PhoneNumberFormat.NATIONAL)

第一引数のphonenmberオブジェクトを第二引数のフォーマットに従って変換しています。

NATIONAが国内表記の意味で、この部分をINTERNATIONALにすれば国内→国際の変換も可能です。

あとはこれをテンプレートに渡すだけです。

ちなみに、この変換はテンプレートの{{}}の中では行えないので気をつけましょう。

終わりに

以上がPhoneNumberField`の使い方でした。

しかし今更ですが、国際コードでの入力が必要ない場面では却って使いにくいですね・・・

国内ユーザーのみを考慮すれば良いのであれば、自分でバリデーションを設定した方が良いと思います。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?