Django मॉडल में फोन नंबर स्टोर करने का सबसे अच्छा तरीका क्या है


131

मैं modelइस तरह से एक फ़ोन नंबर संग्रहीत कर रहा हूँ :

phone_number = models.CharField(max_length=12)

उपयोगकर्ता एक फ़ोन नंबर दर्ज करेगा और मैं SMS Authenticationइस एप्लिकेशन के लिए फ़ोन नंबर का उपयोग करूंगा। इसलिए मुझे भी देश कोड की आवश्यकता होगी। क्या CharFieldफोन नंबर स्टोर करने का अच्छा तरीका है? और, मैं फ़ोन नंबर कैसे मान्य करूँ?


1
यहाँ एक बढ़िया सुझाव है: stackoverflow.com/a/1245990/207791
विक्टर सर्जियनको

जवाबों:


284

आप वास्तव में अंतरराष्ट्रीय स्तर पर मानकीकृत प्रारूप E.164 में देख सकते हैं , उदाहरण के लिए ट्विलियो द्वारा अनुशंसित (जिनके पास एक सेवा है और REST अनुरोधों के माध्यम से एसएमएस या फोन-कॉल भेजने के लिए एपीआई)।

यह फोन नंबर स्टोर करने का सबसे सार्वभौमिक तरीका होने की संभावना है, विशेष रूप से यदि आपके पास अंतरराष्ट्रीय नंबर काम करते हैं।

1. PhoneNumberField द्वारा फ़ोन

आप phonenumber_fieldपुस्तकालय का उपयोग कर सकते हैं । यह 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 

Normolize फोन स्ट्रिंग (परीक्षण और अन्य कर्मचारियों के लिए):

    from phonenumber_field.phonenumber import PhoneNumber
    phone = PhoneNumber.from_string(phone_number=raw_phone, region='RU').as_e164

2. फोन regexp द्वारा

आपके मॉडल के लिए एक नोट: 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

19
यह दिखाने के लिए मूल्यवान हो सकता है कि एक मॉडल पर यह कैसे करना है। phone_regex = RegexValidator (regex = r '^ \ _? 1; \ d {9,15} $', संदेश = "फ़ोन नंबर को प्रारूप में दर्ज किया जाना चाहिए: '+999999999'। 15 अंकों की अनुमति दी।") phone_number। = model.CharField (सत्यापनकर्ता = phone_regex, blank = True)
jpotts18

12
मॉडल में 'max_length = 15' जोड़ना न भूलें। CharField
Esteban

4
@Esteban - max_length = 16 (शुरुआत में एक वैकल्पिक + है)
dhackner

3
@erewok - मुझे विश्वास नहीं है कि आप अपने रेगेक्स में '1' चाहते हैं। E.164 देश कोड को मिलाकर 15 अंकों तक की अनुमति देता है।
dhackner

1
वास्तव में, E.164 में कोई अंतर्राष्ट्रीय कॉल उपसर्ग शामिल नहीं है, केवल देश कोड जिसके बाद वास्तविक संख्या होती है, E.164 संख्या की न्यूनतम लंबाई भी 8 प्रतीत होती है इसलिए regex होना चाहिए '^\+\d{8,15}$'और फिर के max_length=16लिए होना चाहिए CharField
मैक्सिमे आर।

48

Django-phonenumber-field का उपयोग करें: https://github.com/stefanfoulis/django-phonenumber-field

pip install django-phonenumber-field

1
क्षेत्र जोड़ने के लिए मत भूलना। PHONENUMBER_DEFAULT_REGION = 'US'सेटिंग्स के बिना यह आपको कुछ भी इनपुट करने की अनुमति नहीं देगा संयुक्त राज्य अमेरिका के उपयोगकर्ता फोन नंबर के रूप में पहचानेंगे। फिर भी, यह पैकेज किसी ऐसी चीज के रूप में आउटपुट नहीं होगा जो फोन नंबर की तरह दिखती है। । । मुझे यकीन है कि एक ऐसी सेटिंग है जिसे मैंने अभी तक नहीं पाया है!
22

7
नोट: यह पैकेज बहुत बड़ा है। 40 एमबी से अधिक। इसका 33MB जियोडाटा है।
फोरेथिंकर

1
@Forethinker की टिप्पणी को देखते हुए, एक बहुत अधिक हल्का विकल्प है github.com/VeryApt/django-phone-field , throughpip install django-phone-field
SMX

@ फोरथिंकर फिर हम "लाइट" संस्करण का उपयोग कर सकते हैं pip install django-phonenumber-field[phonenumberslite]जिसमें जियोकोडिंग, कैरियर और
टाइमज़ोन


3

सत्यापन आसान है, उन्हें टाइप करने के लिए थोड़ा कोड लिखें। एक चारफिल्ड इसे स्टोर करने का एक शानदार तरीका है। मैं फोन नंबरों के बारे में बहुत ज्यादा चिंता नहीं करूंगा।


1

यह सब उस चीज़ पर निर्भर करता है जिसे आप फोन नंबर के रूप में समझते हैं। फोन नंबर देश विशेष के होते हैं। कई देशों के लिए स्थानीय इलाक़ों के पैकेज में अपना "फ़ोन नंबर फ़ील्ड" होता है। इसलिए यदि आप ठीक देश के विशिष्ट हैं तो आपको लोकलफ्लेवर पैकेज पर एक नज़र डालनी चाहिए (class us.models.PhoneNumberField यूएस केस के लिए, आदि) ।

अन्यथा आप सभी देशों के लिए अधिकतम सीमा प्राप्त करने के लिए स्थानीय इलाकों का निरीक्षण कर सकते हैं। Localflavor में ऐसे फ़ील्ड भी होते हैं जिनका उपयोग आप फ़ोन नंबर को मान्य करने के लिए देश कोड के साथ कर सकते हैं।


हम्म, मैंने पाया कि जब मैंने एक शोध किया था। क्या आप इसका एक उदाहरण दे सकते हैं कि इसे एक रूप में कैसे उपयोग किया जाए।
पाइनोविस

1

मैं वर्णन करता हूं कि मैं क्या उपयोग करता हूं:

सत्यापन: स्ट्रिंग में 5 से अधिक अंक होते हैं।

सफाई: सभी गैर अंकों के प्रतीकों को हटाते हुए, db केवल संख्याओं में लिखें। मैं भाग्यशाली हूं, क्योंकि मेरे देश (रूस) में हर किसी के पास 10 अंकों वाले फोन नंबर हैं। इसलिए मैं db में केवल 10 डाइट स्टोर करता हूँ। यदि आप बहु-देशीय अनुप्रयोग लिख रहे हैं, तो आपको एक व्यापक सत्यापन करना चाहिए।

प्रतिपादन: मैं कस्टम टेम्पलेट टैग को अच्छी तरह से टेम्पलेट में प्रस्तुत करने के लिए लिखता हूं। या यहां तक ​​कि इसे एक तस्वीर की तरह प्रस्तुत करना - एसएमएस स्पैम को रोकने के लिए यह अधिक सुरक्षित है।


0

दूसरों का उल्लेख किया django-phonenumber-field। प्रदर्शन स्वरूप कैसे आप आप सेट करने की जरूरत है चाहता हूँ प्राप्त करने के लिए PHONENUMBER_DEFAULT_FORMATकरने के लिए सेटिंग "E164", "INTERNATIONAL", "NATIONAL", या "RFC3966", फिर भी आप इसे प्रदर्शित करना चाहते हैं। GitHub स्रोत देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.