import django from bs4 import BeautifulSoup
django.setup()
- def print_html(html):
print(BeautifulSoup(html).prettify().strip())
phonenumber_field.phonenumber.PhoneNumber()
phonenumber_field.phonenumber.PhoneNumber.from_string
phonenumber_field.phonenumber.PhoneNumber.is_valid
phonenumber_field.phonenumber.PhoneNumber.as_international
phonenumber_field.phonenumber.PhoneNumber.as_national
phonenumber_field.phonenumber.PhoneNumber.as_e164
phonenumber_field.phonenumber.PhoneNumber.as_rfc3966
wrapper
>>> from phonenumber_field.phonenumber import PhoneNumber
>>> number = PhoneNumber.from_string("+16044011234") >>> print(number.as_national) (604) 401-1234 >>> print(number.as_e164) +16044011234 >>> print(number.as_international) +1 604-401-1234 >>> print(number.as_rfc3966) tel:+1-604-401-1234
# Using national numbers with the region keyword argument. >>> canadian_number = "(604) 401 1234" >>> number = PhoneNumber.from_string(canadian_number, region="CA") >>> print(number.as_e164) +16044011234
The ~phonenumber_field.modelfields.PhoneNumberField
model field
<topics/db/models:fields>
allows storing ~phonenumber_field.phonenumber.PhoneNumber
s in the database, based on a ~django.db.models.CharField
.
The phone number format used by the database is controlled with PHONENUMBER_DB_FORMAT
. When no region is specified, a phone number in the "NATIONAL"
format will be assumed to be from the PHONENUMBER_DEFAULT_REGION
.
- The default
form field <ref/forms/fields:form fields>
for this field is the~phonenumber_field.formfields.PhoneNumberField
. - The default
form widget <ref/forms/widgets:widgets>
for this field is the~phonenumber_field.widgets.RegionalPhoneNumberWidget
.
phonenumber_field.modelfields.PhoneNumberField
__init__
from django.db import models
from phonenumber_field.modelfields import PhoneNumberField
class Customer(models.Model):
name = models.TextField()
# An optional phone number.
phone_number = PhoneNumberField(blank=True)
The ~phonenumber_field.formfields.PhoneNumberField
form field
<ref/forms/fields:form fields>
to validate ~phonenumber_field.phonenumber.PhoneNumber
, based on a ~django.forms.CharField
.
- Default widget:
~phonenumber_field.widgets.RegionalPhoneNumberWidget
- Empty value:
""
- Normalizes to: A
~phonenumber_field.phonenumber.PhoneNumber
or an emptystr
(""
) - Uses
~phonenumber_field.validators.validate_international_phonenumber
phonenumber_field.formfields.PhoneNumberField
__init__
formfield
>>> from django import forms >>> from phonenumber_field.formfields import PhoneNumberField
>>> class PhoneForm(forms.Form): ... number = PhoneNumberField(region="CA") ...
# Manipulating data >>> form = PhoneForm({"number": "+1 604 401 1234"}) >>> form.is_valid() True >>> form.cleaned_data {'number': PhoneNumber(country_code=1, national_number=6044011234, extension=None, italian_leading_zero=None, number_of_leading_zeros=None, country_code_source=1, preferred_domestic_carrier_code=None)} >>> print_html(form.as_div()) <div> <label for="id_number"> Number: </label> <input id="id_number" name="number" required="" type="tel" value="(604) 401-1234"/> </div>
# Handling errors >>> form = PhoneForm({"number": "invalid"}) >>> form.is_valid() False >>> print_html(form.as_div()) <div> <label for="id_number"> Number: </label> <ul class="errorlist"> <li> Enter a valid phone number (e.g. (506) 234-5678) or a number with an international call prefix. </li> </ul> <input aria-invalid="true" id="id_number" name="number" required="" type="tel" value="invalid"/> </div>
Note
Because the PhoneNumberField specifies a region, the example number is a national number from that region. When no region is specified, an international example phone number in the E.164 format is suggested.
Default widget for ~phonenumber_field.formfields.PhoneNumberField
.
- input_type:
tel
- Renders as
<input type="tel" … >
Important
The region should be specified (either per field using the region
keyword argument, or with the PHONENUMBER_DEFAULT_REGION
setting) in order to know which national number format to recognize.
phonenumber_field.widgets.RegionalPhoneNumberWidget
__init__
fallbackwidget
>>> from django import forms >>> from phonenumber_field.formfields import PhoneNumberField
>>> class CanadianPhoneForm(forms.Form): ... # RegionalPhoneNumberWidget is the default widget. ... number = PhoneNumberField(region="CA") ...
# Using the national format for the field’s region. >>> form = CanadianPhoneForm({"number": "+16044011234"}) >>> print_html(form.as_div()) <div> <label for="id_number"> Number: </label> <input id="id_number" name="number" required="" type="tel" value="(604) 401-1234"/> </div>
# Using E164 for an international number. >>> french_number = "+33612345678" >>> form = CanadianPhoneForm({"number": french_number}) >>> print_html(form.as_div()) <div> <label for="id_number"> Number: </label> <input id="id_number" name="number" required="" type="tel" value="+33612345678"/> </div>
Important
Requires the Babel package be installed.
phonenumber_field.widgets.PhoneNumberPrefixWidget
__init__
prefixwidget
>>> from django import forms >>> from phonenumber_field.formfields import PhoneNumberField >>> from phonenumber_field.widgets import PhoneNumberPrefixWidget
# Limiting country choices. >>> class CanadianPhoneForm(forms.Form): ... # RegionalPhoneNumberWidget is the default widget. ... number = PhoneNumberField( ... region="CA", ... widget=PhoneNumberPrefixWidget( ... country_choices=[ ... ("CA", "Canada"), ... ("FR", "France"), ... ], ... ), ... ) ...
>>> form = CanadianPhoneForm({"number_0": "CA", "number_1": "6044011234"}) >>> print_html(form.as_div()) <div> <fieldset> <legend> Number: </legend> <select id="id_number_0" name="number_0" required=""> <option selected="" value="CA"> Canada </option> <option value="FR"> France </option> </select> <input id="id_number_1" name="number_1" required="" type="text" value="6044011234"/> </fieldset> </div>
# Pre-selecting a country. >>> class FrenchPhoneForm(forms.Form): ... # RegionalPhoneNumberWidget is the default widget. ... number = PhoneNumberField( ... region="FR", ... widget=PhoneNumberPrefixWidget( ... initial="FR", ... country_choices=[ ... ("CA", "Canada"), ... ("FR", "France"), ... ], ... ), ... ) ...
>>> form = FrenchPhoneForm() >>> print_html(form.as_div()) <div> <fieldset> <legend> Number: </legend> <select id="id_number_0" name="number_0" required=""> <option value="CA"> Canada </option> <option selected="" value="FR"> France </option> </select> <input id="id_number_1" name="number_1" required="" type="text"/> </fieldset> </div>
The ~phonenumber_field.serializersfields.PhoneNumberField
serializer field, based on the CharField.
The serialization format is controlled by the PHONENUMBER_DEFAULT_FORMAT
.
phonenumber_field.serializerfields.PhoneNumberField
__init__
serializerfield
>>> from django.conf import settings >>> from rest_framework import renderers, serializers >>> from phonenumber_field.serializerfields import PhoneNumberField
>>> class PhoneNumberSerializer(serializers.Serializer): ... number = PhoneNumberField(region="CA") ...
>>> serializer = PhoneNumberSerializer(data={"number": "604 401 1234"}) >>> serializer.is_valid() True >>> serializer.validated_data OrderedDict([('number', PhoneNumber(country_code=1, national_number=6044011234, extension=None, italian_leading_zero=None, number_of_leading_zeros=None, country_code_source=20, preferred_domestic_carrier_code=None))])
# Using the PHONENUMBER_DEFAULT_FORMAT. >>> renderers.JSONRenderer().render(serializer.data) b'{"number":"+16044011234"}'
Validates:
- a
~phonenumber_field.phonenumber.PhoneNumber
instance, or - an
str
in an international format (with a prefix), or - an
str
that’s a local phone number according toPHONENUMBER_DEFAULT_REGION
.
Note
Not all well-formed phone numbers are valid. The rules to construct phone numbers vary per region of the world.
Falsehoods Programmers Believe About Phone Numbers is a good read.
phonenumber_field.validators.validate_international_phonenumber
code: "invalid_phone_number"
Setting value | International | Extensions | Notes |
---|---|---|---|
"E164" (default) |
✓ | ❌ | | https://en.wikipedia.org/wiki/E.164 |
"INTERNATIONAL" |
✓ | ✓ | https://en.wikipedia.org/wiki/E.123#Telephone_number |
"RFC3966" |
✓ | ✓ | https://www.rfc-editor.org/rfc/rfc3966.html |
"NATIONAL" |
❌ | | ✓ | | DISCOURAGED, requires PHONENUMBER_DEFAULT_REGION |
Warning
By default, the library uses E.164, the international public telecommunication numbering plan, which does not support phone numbers extensions. Set both PHONENUMBER_DB_FORMAT
and PHONENUMBER_DEFAULT_FORMAT
to an extension-compatible format to handle phone numbers extensions.
PHONENUMBER_DB_FORMAT
Store phone numbers strings in the specified format in the database.
Default: "E164"
.
See settings-format-choices
.
Warning
Data loss may occur when changing the DB format.
Phone numbers stored in the database are parsed every time they are loaded from the database.
When switching from a format that can represent extensions to a format that cannot, the extension information is definitely lost.
When using PHONENUMBER_DB_FORMAT
="NATIONAL"
, changing the PHONENUMBER_DEFAULT_REGION
will cause phone numbers stored in the database to be interpreted differently, resulting in data corruption.
PHONENUMBER_DEFAULT_FORMAT
String formatting of phone numbers.
Default: "E164"
.
See settings-format-choices
.
PHONENUMBER_DEFAULT_REGION
ISO-3166-1 two-letter country code indicating how to interpret regional phone numbers.
Default: None
.