我目前正在使用 phonenumbers 包作为我的 django 的 UserCreationForm 的电话号码字段的验证方法。在我当前的代码中,我使用 get 方法从其字段中检索电话号码,然后进行验证。如果输入的号码不存在,则会弹出一个表单错误并说明该号码不是国家/地区的格式(在这种情况下我使用的是新加坡)。请告诉我应该对我当前的代码进行哪些更改。
我试过使用 “from phonenumber_field.formfields import PhoneNumberField” 进行电话号码验证,它验证了我输入的号码,唯一的问题是用户必须输入他们的国家代码,而我不能输入。我只使用 phonenumbers 包,这样用户就不必输入国家代码。
/* 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 位数字,如果该号码不存在则引发错误。
原文由 Jackson_Stake 发布,翻译遵循 CC BY-SA 4.0 许可协议
您的验证对我来说看起来是正确的,但是您做错了两件事:
clean_phone_number()
而不是clean_phone
。该字段是phone_number
不是phone
。CharField
instead ofIntegerField
(too restrictive for many users) andreturn z.national_number
instead ofphone_number
, that way it’s returning保存前正确清理的号码。或者你想要存储它的任何格式。