我像这样在model
中存储电话号码:
phone_number = models.CharField(max_length=12)
用户将输入电话号码,我将使用该电话号码进行 SMS身份验证。该应用程序将在全球范围内使用。因此,我还需要一个国家代码。使用 CharField
存储电话号码是一种好方法吗?另外,我如何验证电话号码?
我像这样在model
中存储电话号码:
phone_number = models.CharField(max_length=12)
用户将输入电话号码,我将使用该电话号码进行 SMS身份验证。该应用程序将在全球范围内使用。因此,我还需要一个国家代码。使用 CharField
存储电话号码是一种好方法吗?另外,我如何验证电话号码?
Phone by PhoneNumberField
You can use the phonenumber_field
library. It is a port of Google's libphonenumber library, which powers Android's phone number handling. See django-phonenumber-field.
In the model:
from phonenumber_field.modelfields import PhoneNumberField
class Client(models.Model, Importable):
phone = PhoneNumberField(null=False, blank=False, unique=True)
In the form:
from phonenumber_field.formfields import PhoneNumberField
class ClientForm(forms.Form):
phone = PhoneNumberField()
Get the phone as a string from an object field:
client.phone.as_e164
Normalize the phone string (for tests and other staff):
from phonenumber_field.phonenumber import PhoneNumber
phone = PhoneNumber.from_string(phone_number=raw_phone, region='RU').as_e164
Phone by regexp
One note for your model: E.164 numbers have a maximum character length of 15.
To validate, you can employ some combination of formatting and then attempting to contact the number immediately to verify.
I believe I used something like the following in my django project:
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."))
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
CharField
,max_length=16
。 - Maxime R.pip install django-phonenumber-field
pip install django-phonenumber-field[phonenumberslite]
。请注意不要改变原文意思,尽可能使翻译通俗易懂。 - heyxhCharField
作为电话字段,在表单验证中使用localflavor
应用程序。您可以访问https://docs.djangoproject.com/en/1.7/topics/localflavor/获取更多信息。django-phonenumber-field
(与phonenumbers
一起)。 - nicorelliuspip install django-phonenumber-field[phonenumbers]
# "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"中注册"Contact":
# "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='US'添加到"PhoneNumberPrefixWidget()"来设置初始国家代码,因为有时在Django Admin中使用"PHONENUMBER_DEFAULT_REGION"不能正确显示已保存的电话号码:
# "settings.py"
PHONENUMBER_DEFAULT_REGION = "US"
验证很简单。给他们发送一些代码进行输入即可。
CharField是存储它的好方法。我不会太担心规范化电话号码。
pip install django-phone-field
接下来在文件models.py中:
from phone_field import PhoneField
...
class Client(models.Model):
...
phone_number = PhoneField(blank=True, help_text='Contact phone number')
在settings.py文件中:
INSTALLED_APPS = [...,
'phone_field'
]
其他人提到了 django-phonenumber-field
。如果想要按照自己的方式显示该格式,需要将 PHONENUMBER_DEFAULT_FORMAT
设置为 "E164"
, "INTERNATIONAL"
, "NATIONAL"
或者 "RFC3966"
。请参考GitHub源代码。
首先,您需要安装电话号码Django包。
pip install django-phonenumber-field[phonenumbers]
INSTALLED_APPS = [
...
'phonenumber_field',
...
]
from phonenumber_field.modelfields import PhoneNumberField
class Artist(models.Model):
phone_number = PhoneNumberField()