জ্যাঙ্গো মডেলগুলিতে ফোন নম্বর সঞ্চয় করার সর্বোত্তম উপায়


131

আমি modelএই মত একটি ফোন নম্বর সংরক্ষণ করছি :

phone_number = models.CharField(max_length=12)

ব্যবহারকারী একটি ফোন নম্বর প্রবেশ করবে এবং আমি ফোন নম্বরটি ব্যবহার করব SMS Authenticationএই অ্যাপ্লিকেশনটি বিশ্বব্যাপী ব্যবহৃত হবে। সুতরাং আমারও দেশের কোড দরকার। CharFieldফোন নম্বর সঞ্চয় করার কি ভাল উপায়? এবং, আমি ফোন নম্বরটি কীভাবে যাচাই করব?


1
আছে: একটি দুর্দান্ত পরামর্শ এখানে stackoverflow.com/a/1245990/207791
ভিক্টর Sergienko

উত্তর:


283

আপনি সম্ভবত আন্তর্জাতিকভাবে স্ট্যান্ডার্ডযুক্ত ফর্ম্যাট E.164 দেখতে পাচ্ছেন , উদাহরণস্বরূপ টোলিওর দ্বারা প্রস্তাবিত (যার কাছে একটি পরিষেবা এবং এসইএস অনুরোধের মাধ্যমে এসএমএস বা ফোন কল প্রেরণের জন্য একটি এপিআই রয়েছে)।

ফোন নম্বর সংরক্ষণের এটি সর্বজনীন উপায় হতে পারে, বিশেষত যদি আপনার আন্তর্জাতিক নম্বর থাকে তবে।

1. ফোননম্বারফিল্ড দ্বারা ফোন

আপনি phonenumber_fieldগ্রন্থাগার ব্যবহার করতে পারেন । এটি গুগলের লাইফফোনেম্বার লাইব্রেরির বন্দর, যা অ্যান্ড্রয়েডের ফোন নম্বর পরিচালনা করার ক্ষমতা দেয় 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

২. রিজেক্সের মাধ্যমে ফোন

আপনার মডেলের জন্য একটি নোট: E.164 সংখ্যার 15 এর সর্বোচ্চ অক্ষরের দৈর্ঘ্য রয়েছে।

যাচাই করার জন্য, আপনি কিছু বিন্যাসের মিশ্রণ নিয়োগ করতে পারেন এবং তারপরে যাচাই করতে অবিলম্বে নম্বরটির সাথে যোগাযোগের চেষ্টা করতে পারেন।

আমার বিশ্বাস আমি আমার জ্যাঙ্গো প্রকল্পে নিম্নলিখিতগুলির মতো কিছু ব্যবহার করেছি:

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
মডেলটিতে এটি কীভাবে করা যায় তা দেখানো মূল্যবান হতে পারে। ফোন_রেজেক্স = রেজেক্সভালিডেটর (রিজেক্স = আর '^ \ +? 1? \ d {9,15} $', বার্তা = "ফোন নম্বর অবশ্যই বিন্যাসে প্রবেশ করাতে হবে: '+999999999'। 15 টি সংখ্যা পর্যন্ত অনুমোদিত allowed") ফোন নম্বর = মডেল.চরফিল্ড (বৈধকারক = ফোন_রেজেক্স, ফাঁকা = সত্য)
jpotts18

12
মডেলগুলিতে 'সর্বোচ্চ_ দৈর্ঘ্য = 15' যুক্ত করতে ভুলবেন না har চ্যারফিল্ড
এস্তেবান

4
@ ইস্তেবান - সর্বোচ্চ_ দৈর্ঘ্য = 16 (শুরুতে একটি alচ্ছিক + রয়েছে)
haাকনার

3
@ ইরেওক - আমি বিশ্বাস করি না যে আপনি আপনার রেজেক্সে '1' চান। E.164 দেশের কোড সহ 15 টি সংখ্যা পর্যন্ত মঞ্জুরি দেয়।
haাকনার

1
নিশ্চয় E.164 কোন আন্তর্জাতিক কল উপসর্গ কেবলমাত্র সেদেশের প্রকৃত সংখ্যা দ্বারা অনুসরণ কোড, অন্তর্ভুক্ত নয় এছাড়াও একটি E.164 সংখ্যা সর্বনিম্ন দৈর্ঘ্য তাই Regex হওয়া উচিত 8 হবে বলে মনে হয় '^\+\d{8,15}$'এবং তারপর max_length=16জন্য CharField
ম্যাক্সিম আর।

48

জ্যাঙ্গো-ফোনেম্বার-ফিল্ড ব্যবহার করুন: https://github.com/stefanfoulis/django-phonenumber-field

pip install django-phonenumber-field

1
অঞ্চল যুক্ত করতে ভুলবেন না। ছাড়া PHONENUMBER_DEFAULT_REGION = 'US'সেটিংসে এটি একটি ফোন নম্বর হিসাবে স্বীকৃতি চাই মার্কিন যুক্তরাষ্ট্র থেকে ইনপুট কিছু ব্যবহারকারীদের জন্য আপনি অনুমতি দেয় না। তারপরেও, এই প্যাকেজটি কোনও ফোন নম্বরের মতো দেখায় output । । আমি নিশ্চিত যে এমন একটি সেটিং আছে যা আমি এখনও পাইনি!
ড্রিগান

7
দ্রষ্টব্য: এই প্যাকেজটি খুব বড়। 40MB ওভার। এর 33MB হ'ল জিওডাটা।
ফোরথিংকার

1
@ ফোরথিংকারের মন্তব্যে উল্লেখ করে, আরও অনেক হালকা বিকল্প হ'ল github.com/VeryApt/django- iPhone-field , এর মাধ্যমেpip install django-phone-field
এসএমএক্স

@ ফোরথিংকার তখন আমরা "লাইট" সংস্করণটি ব্যবহার করতে পারি pip install django-phonenumber-field[phonenumberslite]যা জিওকোডিং, ক্যারিয়ার এবং টাইমজোন মেটাডেটা অন্তর্ভুক্ত করে না
হাইজর


3

বৈধকরণ সহজ, তাদের টাইপ করতে একটি সামান্য কোড পাঠান Char একটি চারফিল্ড এটি সঞ্চয় করার দুর্দান্ত উপায়। ফোন নম্বরগুলি ক্যানোনিকালাইজিং সম্পর্কে আমি খুব বেশি চিন্তা করব না।


1

আপনি ফোন নম্বর হিসাবে যা বোঝেন তার উপর এটি নির্ভর করে। ফোন নম্বরগুলি দেশ নির্দিষ্ট। বেশ কয়েকটি দেশের লোকালফ্ল্যাওয়ার প্যাকেজগুলিতে তাদের নিজস্ব "ফোন নম্বর ক্ষেত্র" রয়েছে। সুতরাং আপনি যদি দেশ নির্দিষ্ট হয়ে থাকেন তবে আপনার লোকালফ্লেভার প্যাকেজটি দেখে নেওয়া উচিত ( class us.models.PhoneNumberFieldমার্কিন ক্ষেত্রে, ইত্যাদি)

অন্যথায় আপনি লোকালফ্ল্যাভারগুলিকে সমস্ত দেশের সর্বাধিক দৈর্ঘ্য পেতে পরিদর্শন করতে পারেন। লোকালফ্ল্যাওয়ারের এমন ফর্ম ক্ষেত্র রয়েছে যা আপনি ফোন নম্বরটি বৈধ করার জন্য দেশের কোডের সাথে ব্যবহার করতে পারেন।


এইচএম হ্যাঁ, আমি একটি গবেষণা করার সময় খুঁজে পেয়েছি। কীভাবে এটি কোনও ফর্মে ব্যবহার করতে হয় তার একটি উদাহরণ দিতে পারেন।
পিনোভাইস

1

আমি যা ব্যবহার করি তা বর্ণনা করব:

বৈধকরণ: স্ট্রিংয়ে 5 টিরও বেশি সংখ্যা রয়েছে।

পরিষ্কার করা: সমস্ত অ অংক চিহ্নগুলি সরিয়ে, ডিবিতে কেবল সংখ্যা লিখুন। আমি ভাগ্যবান, কারণ আমার দেশে (রাশিয়া) প্রত্যেকেরই 10 নম্বর সহ ফোন নম্বর থাকে। সুতরাং আমি ডিবিতে কেবল 10 টি ডাইটে সঞ্চয় করি। আপনি যদি মাল্টি-কান্ট্রি অ্যাপ্লিকেশন লিখছেন তবে আপনার উচিত একটি ব্যাপক বৈধতা।

রেন্ডারিং: টেমপ্লেটে সুন্দরভাবে রেন্ডার করতে আমি কাস্টম টেম্পলেট ট্যাগটি লিখি। অথবা এমনকি এটি ছবির মতো রেন্ডার করুন - এসএমএস স্প্যাম প্রতিরোধে এটি আরও সুরক্ষিত।


0

অন্যরা উল্লেখ করেছেন django-phonenumber-field। প্রদর্শনের বিন্যাস কিভাবে আপনি সেট করতে হবে আপনি চান পেতে PHONENUMBER_DEFAULT_FORMATকী মুদ্রণ বৈশিষ্ট্য সমর্থন "E164", "INTERNATIONAL", "NATIONAL", অথবা "RFC3966", তবে আপনি এটি প্রদর্শিত চাই। দেখুন GitHub উৎস

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.