python - 如何在 Django 中验证电话号码?

标签 python python-3.x django validation phone-number

我目前正在使用 phonenumbers 包作为我的 django 的 UserCreationForm 的电话号码字段的验证方法。在我当前的代码中,我使用 get 方法从其字段中检索电话号码,然后进行验证。如果输入的号码不存在,则会弹出一个表单错误并说明该号码不是国家/地区的格式(在这种情况下我使用的是新加坡)。请告诉我应该对我当前的代码进行哪些更改。

我试过使用 "from phonenumber_field.formfields import PhoneNumberField" 进行电话号码验证,它验证了我输入的号码,唯一的问题是用户必须输入他们的国家代码,我不能有那个。我只使用电话号码包,这样用户就不必输入国家代码。

/* forms.py */
import phonenumbers
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from validate_email import validate_email
from phonenumber_field.formfields import PhoneNumberField


class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()
    # phone_number = PhoneNumberField()
    phone_number = forms.IntegerField(required=True)

    class Meta:
        model = User
        fields = ['username', 'email', 'phone_number']

    def clean_email(self):
        email = self.cleaned_data.get("email")
        if not validate_email(email, verify=True):
            raise forms.ValidationError("Invalid email")
        return email

    def clean_phone(self):
        phone_number = self.cleaned_data.get("phone_number")
        z = phonenumbers.parse(phone_number, "SG")
        if not phonenumbers.is_valid_number(z):
            raise forms.ValidationError("Number not in SG format")
        return phone_number

/* views.py */
from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegisterForm


def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            # user = form.save()
            # phone_number = form.cleaned_data['phone']
            # do something with phone number??
            user = form.save()
            user.refresh_from_db()
            phone = form.cleaned_data.get('phone_number')
            user.Meta.phone_number = phone
            user.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Account created for {username}!')
            return redirect('blog-home')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

我希望输出能够验证电话字段中输入的没有国家代码且只有 8 位数字的电话号码,如果该号码不存在则引发错误。

最佳答案

你的验证在我看来是正确的,但你做错了两件事:

  • 将方法重命名为 clean_phone_number() 而不是 clean_phone。该字段是 phone_number 而不是 phone
  • 将字段更改为 CharField 而不是 IntegerField(对许多用户来说过于严格)并且 返回 z.national_number 而不是 phone_number,这样它会在保存前返回正确清理过的号码。或者您希望以何种格式存储它。

关于python - 如何在 Django 中验证电话号码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58006706/

相关文章:

python - 无法在 Linux 的虚拟环境中使用包

自定义 Django 模板标签中的 Javascript?

python - 重命名 pandas 数据框中的一系列名称

python - 在python中用父类方法覆盖__init__

python - 如何组合两列的浮点值并将其放入数据帧的另一列中?

python-3.x - 这两种在 Python 中建立网络连接的方式之间的实际区别是什么?

python - 将列表插入单元格 - 为什么 loc 实际上在这里工作?

python-3.x - 如何使用LSTM对图像进行时间序列预测?

Python 骰子滚动模拟

python - Heroku 上的 Django : relation "app_label" does not exist