我在模型中存储一个电话号码,就像这样:

phone_number = models.CharField(max_length=12)

用户将输入一个电话号码,我将使用该电话号码进行SMS身份验证。该应用程序将被全局使用。所以我还需要国家代码。CharField是存储电话号码的好方法吗?以及,我如何验证电话号码?


当前回答

我将描述我所使用的:

验证:字符串包含超过5位数字。

清除:删除所有非数字符号,只向数据库写入数字。我很幸运,因为在我的国家(俄罗斯),每个人的电话号码都是10位数。所以我在数据库中只存储了10个数字。如果您正在编写一个多国应用程序,那么您应该进行全面验证。

渲染:我编写了一个自定义模板标记,以便在模板中很好地渲染它。甚至像图片一样渲染它-这是更安全的防止短信垃圾邮件。

其他回答

这完全取决于你对电话号码的理解。电话号码是国家特有的。一些国家的本地风味包包含他们自己的“电话号码字段”。因此,如果你是特定国家的OK,你应该看看localflavor包(类US .models. phonenumberfield为美国情况,等等)。

否则,你可以检查当地的口味,以获得所有国家的最大长度。Localflavor还有一些表单字段,可以与国家代码一起使用来验证电话号码。

使用django-phonenumber-field:

pip install django-phonenumber-field

在模型中的phone字段使用CharField,在localflavor应用程序中使用表单验证:

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

从2021-12-07开始,LocalFlavor似乎不再是Django的一部分了。

首先,用下面的命令安装"django-phonenumber-field"包:

pip install django-phonenumber-field[phonenumbers]

然后,在"settings.py"中将"phonenumber_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”中注册“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"来设置一个初始国家代码,如下所示,但我建议像我上面所做的那样,使用"PHONENUMBER_DEFAULT_REGION"来设置一个初始国家代码为"PhoneNumberPrefixWidget()",因为使用"PHONENUMBER_DEFAULT_REGION"有时不会在Django Admin中显示保存的电话号码:

# "settings.py"

PHONENUMBER_DEFAULT_REGION = "US"

我将描述我所使用的:

验证:字符串包含超过5位数字。

清除:删除所有非数字符号,只向数据库写入数字。我很幸运,因为在我的国家(俄罗斯),每个人的电话号码都是10位数。所以我在数据库中只存储了10个数字。如果您正在编写一个多国应用程序,那么您应该进行全面验证。

渲染:我编写了一个自定义模板标记,以便在模板中很好地渲染它。甚至像图片一样渲染它-这是更安全的防止短信垃圾邮件。