programing

장고 모델에서 전화번호를 저장하는 가장 좋은 방법은 무엇입니까?

sourcejob 2023. 5. 24. 22:05
반응형

장고 모델에서 전화번호를 저장하는 가장 좋은 방법은 무엇입니까?

를 전화번저중다니입에 하고 있습니다.model다음과 같이:

phone_number = models.CharField(max_length=12)

사용자는 전화번호를 입력하고 저는 SMS 인증을 위해 전화번호를 사용합니다.이 응용 프로그램은 전체적으로 사용됩니다.그래서 국가 코드도 필요합니다.아이즈CharField전화번호를 저장하는 좋은 방법?그리고 전화번호는 어떻게 확인합니까?

를 들어 Twilio가 권장하는 국제 표준 형식 E.164를 실제로 확인할 수 있습니다(REST 요청을 통해 SMS 또는 전화 통화를 전송하는 서비스와 API가 있음).

이것은 특히 국제 번호를 사용하는 경우 전화 번호를 저장하는 가장 보편적인 방법일 가능성이 높습니다.

  1. 전화 번호 필드별 전화

    당신은 할 수 .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
    
  2. 정규식별 전화

    모델에 대한 참고 사항: 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 is allowed."))
    

jpotter6에 따르면 모델에서도 다음과 같은 작업을 수행할 수 있습니다.

파일 모델.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

사용된 장고 전화 번호 필드:

pip install django-phonenumber-field

을 합니다.CharField및 모의전필드및화에 합니다.localflavor양식 유효성 검사를 위한 앱:

https://docs.djangoproject.com/en/1.7/topics/localflavor/

2021-12-07년 현재, LocalFlavor는 더 이상 장고의 일부가 아닌 것 같습니다.

검증은 간단합니다.문자로 입력할 코드를 입력합니다.

CharField는 저장하기에 좋은 방법입니다.저는 전화번호를 표준화하는 것에 대해 크게 걱정하지 않을 것입니다.

이 솔루션은 저에게 효과가 있었습니다.

장고 전화 필드를 처음 설치합니다.명령:

pip install django-phone-field

그리고 파일 모델에서.py:

from phone_field import PhoneField
...

class Client(models.Model):
    ...
    phone_number = PhoneField(blank=True, help_text='Contact phone number')

그리고 파일 설정에서.py:

INSTALLED_APPS = [...,
                  'phone_field'
]

결국에는 다음과 같이 보입니다.

전화 양식

먼저 아래 명령을 사용하여 "장고 전화 번호 필드" 패키지를 설치합니다.

pip install django-phonenumber-field[phonenumbers]

그런 다음 "settings.py "에서 "installednumber_field"를 "installed_APPS"로 설정합니다.

# "settings.py"

INSTALLED_APPS = [
    ...
    "phonenumber_field",
    ...
]

그런 다음 "models.py "에서 "PhoneNumberField()"로 필드를 설정합니다.

# "models.py"

from django.db import models
from phonenumber_field.modelfields import PhoneNumberField

class Contact(models.Model):
    phone = PhoneNumberField()

그런 다음 "admin.py ""연락처"를 등록합니다.

# "admin.py"

from django.contrib import admin
from .models import Contact

@admin.register(Contact)
class ContactAdmin(admin.ModelAdmin):
    pass

그런 다음 아래 명령을 실행합니다.

python manage.py makemigrations && python manage.py migrate

이제 다음과 같이 전화 번호 필드가 작성됩니다.

여기에 이미지 설명 입력

또한 위젯 "PhoneNumberPrefixWidget()"을 사용자 정의 양식의 필드에 할당하고 다음과 같이 사용자 정의 양식을 관리자에게 할당합니다.

# "admin.py"

from django.contrib import admin
from .models import Contact
from django import forms
from phonenumber_field.widgets import PhoneNumberPrefixWidget

class ContactForm(forms.ModelForm):
    class Meta:
        widgets = {
            'phone': PhoneNumberPrefixWidget(),
        }

@admin.register(Contact)
class ContactAdmin(admin.ModelAdmin):
    form = ContactForm

이제 국가 코드를 사용하여 전화 번호 필드가 생성됩니다.

여기에 이미지 설명 입력

그리고 initial='과 같은 초기 국가 코드를 설정할 수 있습니다.아래와 같이 US'에서 "PhoneNumberPrefixWidget()"으로 변경합니다.*초기 국가 코드는 대문자여야 합니다.

# "admin.py"

from django.contrib import admin
from .models import Contact
from django import forms
from phonenumber_field.widgets import PhoneNumberPrefixWidget

class ContactForm(forms.ModelForm):
    class Meta:
        widgets = {                          # Here
            'phone': PhoneNumberPrefixWidget(initial='US'),
        }

@admin.register(Contact)
class ContactAdmin(admin.ModelAdmin):
    form = ContactForm

초기 국가 코드 "US"를 선택하면 전화 번호 필드가 생성됩니다.

여기에 이미지 설명 입력

아래와 같이 "settings.py "에서 "PHONENUMBER_DEFAULT_REGION"으로 초기 국가 코드를 설정할 수도 있지만 초기 국가 코드는 initial='로 설정하는 것이 좋습니다."PHONENUMBER_DEFAULT_REGION"을 사용하면 저장된 전화 번호가 장고 관리자에 표시되지 않는 경우가 있기 때문에 위에서 설명한 것처럼 US'에서 "PhoneNumberPrefixWidget()"로 변경합니다.

# "settings.py"

PHONENUMBER_DEFAULT_REGION = "US"

언급된 기타 사항django-phonenumber-field설정할 표시 형식을 가져오려면PHONENUMBER_DEFAULT_FORMAT설정"E164","INTERNATIONAL","NATIONAL"또는"RFC3966"원하는 대로 표시할 수 있습니다.GitHub 소스를 참조하십시오.

모든 것은 당신이 전화번호로 무엇을 이해하느냐에 달려 있습니다.전화 번호는 국가별로 다릅니다.여러 국가의 로컬 맛 패키지에는 자체 "전화 번호 필드"가 포함되어 있습니다.따라서 국가별로 괜찮으시다면 현지 맛 패키지를 살펴봐야 합니다.class us.models.PhoneNumberField미국의 경우 등)

그렇지 않으면 모든 국가의 최대 길이를 얻기 위해 현지 맛을 검사할 수 있습니다.로컬 맛에는 국가 코드와 함께 전화 번호를 확인하는 데 사용할 수 있는 양식 필드도 있습니다.

제가 사용하는 것에 대해 설명하겠습니다.

유효성 검사:문자열이 5자리를 초과합니다.

정리: 숫자가 아닌 모든 기호를 제거하고 숫자만 데이터베이스에 기록합니다.저는 운이 좋습니다. 왜냐하면 우리나라(러시아)에서는 모든 사람들이 10자리 숫자의 전화번호를 가지고 있기 때문입니다.그래서 저는 데이터베이스에 10자리만 저장합니다.다국적 지원서를 작성하는 경우 포괄적인 검증을 해야 합니다.

렌더링:저는 템플릿에서 멋지게 렌더링하기 위해 사용자 지정 템플릿 태그를 작성합니다.또는 사진처럼 렌더링할 수도 있습니다. SMS 스팸을 방지하는 것이 더 안전합니다.

우선 전화번호 장고 패키지를 설치하셔야 합니다.

pip install django-phonenumber-field[phonenumbers]

그런 다음 설치된 애플리케이션에 추가합니다.

INSTALLED_APPS = [
    ...
    'phonenumber_field',
    ...
]

모델에서 사용하는 방법은 다음과 같습니다.

from phonenumber_field.modelfields import PhoneNumberField

class Artist(models.Model):

    phone_number = PhoneNumberField()

언급URL : https://stackoverflow.com/questions/19130942/whats-the-best-way-to-store-a-phone-number-in-django-models

반응형