Saya menyimpan nomor telepon model
seperti ini:
phone_number = models.CharField(max_length=12)
Pengguna akan memasukkan nomor telepon dan saya akan menggunakan nomor telepon untuk SMS Authentication
Aplikasi ini akan digunakan secara global. Jadi saya juga perlu kode negara. Apakah CharField
cara yang baik untuk menyimpan nomor telepon? Dan, bagaimana saya memvalidasi nomor telepon?
django
django-forms
django-validation
layanan pribadi
sumber
sumber
Jawaban:
Anda mungkin benar-benar melihat ke dalam format standar internasional E.164 , direkomendasikan oleh Twilio misalnya (yang memiliki layanan dan API untuk mengirim SMS atau panggilan telepon melalui permintaan REST).
Ini kemungkinan merupakan cara paling universal untuk menyimpan nomor telepon, khususnya jika Anda memiliki nomor internasional.
1. Telepon dengan PhoneNumberField
Anda bisa menggunakan
phonenumber_field
perpustakaan. Ini adalah port dari perpustakaan libphonenumber Google, yang mendukung penanganan nomor telepon Android https://github.com/stefanfoulis/django-phonenumber-fieldDalam model:
Dalam bentuk:
Dapatkan ponsel sebagai string dari bidang objek:
Normolisasi string telepon (untuk tes dan staf lain):
2. Telepon dengan regexp
Satu catatan untuk model Anda: angka E.164 memiliki panjang karakter maks 15.
Untuk memvalidasi, Anda dapat menggunakan beberapa kombinasi pemformatan dan kemudian mencoba menghubungi nomor tersebut segera untuk memverifikasi.
Saya percaya saya menggunakan sesuatu seperti berikut pada proyek Django saya:
EDIT
Tampaknya pos ini bermanfaat bagi sebagian orang, dan tampaknya layak untuk mengintegrasikan komentar di bawah ini ke dalam jawaban yang lebih lengkap. Sesuai jpotter6 , Anda dapat melakukan sesuatu seperti yang berikut pada model Anda juga:
models.py:
sumber
'^\+\d{8,15}$'
dan kemudianmax_length=16
untukCharField
.Gunakan django-phonenumber-field: https://github.com/stefanfoulis/django-phonenumber-field
sumber
PHONENUMBER_DEFAULT_REGION = 'US'
dalam pengaturan itu tidak akan memungkinkan Anda untuk memasukkan apa pun yang akan dikenali oleh pengguna dari Amerika Serikat sebagai nomor telepon. Meski begitu, paket ini tidak akan menampilkan sesuatu yang terlihat seperti nomor telepon. . . Saya yakin ada pengaturan yang belum saya temukan!pip install django-phone-field
pip install django-phonenumber-field[phonenumberslite]
yang tidak termasuk geocoding, carrier dan metadata zona waktuGunakan
CharField
untuk bidang telepon dalam model danlocalflavor
aplikasi untuk validasi formulir:https://docs.djangoproject.com/en/1.7/topics/localflavor/
sumber
Validasi mudah, teks mereka sedikit kode untuk mengetik. CharField adalah cara yang bagus untuk menyimpannya. Saya tidak akan terlalu khawatir tentang kanonikisasi nomor telepon.
sumber
Itu semua tergantung pada apa yang Anda pahami sebagai nomor telepon. Nomor telepon spesifik negara. Paket rasa lokal untuk beberapa negara berisi "bidang nomor telepon" mereka sendiri. Jadi, jika Anda setuju dengan negara spesifik Anda harus melihat pada paket rasa lokal (
class us.models.PhoneNumberField
untuk kasus AS, dll.)Kalau tidak, Anda bisa memeriksa rasa lokal untuk mendapatkan panjang maksimal untuk semua negara. Localflavor juga memiliki bidang formulir yang dapat Anda gunakan bersama dengan kode negara untuk memvalidasi nomor telepon.
sumber
Saya akan menjelaskan apa yang saya gunakan:
Validasi: string berisi lebih dari 5 digit.
Pembersihan: menghapus semua simbol non digit, tulis hanya dalam angka db. Saya beruntung, karena di negara saya (Rusia) setiap orang memiliki nomor telepon dengan 10 digit. Jadi saya menyimpan dalam db hanya 10 buah. Jika Anda menulis aplikasi multi-negara, maka Anda harus membuat validasi komprehensif.
Rendering: Saya menulis tag templat khusus untuk membuatnya dalam templat dengan baik. Atau bahkan membuatnya seperti gambar - lebih aman untuk mencegah spam sms.
sumber
Lainnya disebutkan
django-phonenumber-field
. Untuk mendapatkan format tampilan bagaimana Anda ingin Anda perlu setPHONENUMBER_DEFAULT_FORMAT
pengaturan untuk"E164"
,"INTERNATIONAL"
,"NATIONAL"
, atau"RFC3966"
, namun Anda ingin ditampilkan. Lihat sumber GitHub .sumber