Как проверить номер телефона в Django? - PullRequest
0 голосов
/ 19 сентября 2019

В настоящее время я использую пакет phonenumbers в качестве метода проверки для UserCreationForm моего django для его поля номера телефона.В моем текущем коде я использую метод get, чтобы получить номер телефона из его поля и затем выполнить проверку.Если введенный номер не существует, должна появиться ошибка формы и указать, что номер не в формате страны (в этом случае я использую Сингапур).Пожалуйста, скажите мне, какие изменения должны быть внесены в мой текущий код.

Я пытался использовать "из 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цифры и выдают ошибку, если этот номер не существует.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Я не совсем знаком с этими пакетами, но после просмотра кода репо за ними кажется, что вы можете просто установить атрибут region на PhoneNumberField и продолжать наследовать все его функции проверки и предотвратитьнужно, чтобы пользователи вводили свой регион?

Как-то так?


class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()
    # Does this not work for your case?
    phone_number = PhoneNumberField(region="SG")

    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
0 голосов
/ 19 сентября 2019

Ваша проверка выглядит правильно для меня, но вы делаете две вещи неправильно:

  • Переименуйте метод в clean_phone_number() вместо clean_phone.Поле phone_number не phone.
  • Измените поле на CharField вместо IntegerField (слишком ограничительно для многих пользователей) и return z.national_number вместо phone_number, таким образом, этовернуть правильно очищенный номер перед сохранением.Или в любом формате, в котором вы хотите его сохранить.
...