Поле GenericIPAddressField

Поле GenericIPAddressField в Django формах используется для приема и валидации IP-адресов. Оно поддерживает как IPv4, так и IPv6 форматы, предоставляя гибкую настройку протоколов. Поле автоматически проверяет корректность введенного адреса и преобразует его в строковый формат. При создании поля можно указать параметры protocol для ограничения протоколов и unpack_ipv4 для обработки IPv4-адресов в IPv6-формате.

Синтаксис

pythonfrom django import forms

field = forms.GenericIPAddressField(
  protocol='both',  # 'both', 'IPv4', 'IPv6'
  unpack_ipv4=False,
  required=True,
  label='IP Address',
  initial='',
  help_text='Enter a valid IP address'
)

Параметры

Основные параметры поля GenericIPAddressField:

Пример . С формой

Создадим форму для ввода IP-адреса сервера:

pythonfrom django import forms

class ServerForm(forms.Form):
  server_ip = forms.GenericIPAddressField(
    protocol='both',
    label='Server IP Address',
    help_text='Enter IPv4 or IPv6 address'
  )
  server_name = forms.CharField(max_length=100)

Пример . С ограничением протокола

Создадим форму, которая принимает только IPv6 адреса:

pythonfrom django import forms

class IPv6Form(forms.Form):
  ipv6_address = forms.GenericIPAddressField(
    protocol='IPv6',
    label='IPv6 Address',
    help_text='Enter a valid IPv6 address'
  )

Пример . С обработкой данных

Обработаем данные формы с IP-адресом:

pythonfrom django import forms

class NetworkForm(forms.Form):
  router_ip = forms.GenericIPAddressField(
    protocol='both',
    unpack_ipv4=True
  )
  subnet_mask = forms.CharField(max_length=15)

# Пример использования
form_data = {
  'router_ip': '::ffff:192.168.1.1',
  'subnet_mask': '255.255.255.0'
}
form = NetworkForm(form_data)
if form.is_valid():
  router_ip = form.cleaned_data['router_ip']
  print(router_ip)

Результат выполнения кода:

python"192.168.1.1"

Пример . С валидацией

Поле GenericIPAddressField автоматически проверяет корректность введенного адреса:

pythonfrom django import forms

class FirewallForm(forms.Form):
  source_ip = forms.GenericIPAddressField(
    protocol='both',
    label='Source IP'
  )
  destination_ip = forms.GenericIPAddressField(
    protocol='both',
    label='Destination IP'
  )

# Пример с неверным адресом
invalid_data = {
  'source_ip': '256.256.256.256',
  'destination_ip': '2001:db8::1'
}
form = FirewallForm(invalid_data)
if not form.is_valid():
  errors = form.errors
  print(errors)

Результат выполнения кода:

python{"source_ip": ["Enter a valid IPv4 or IPv6 address."]}

Смотрите также

  • поле CharField,
    которое используется для текстовых строк
  • поле EmailField,
    которое валидирует email-адреса
  • поле URLField,
    которое валидирует URL-адреса
  • валидатор validate_ipv46_address,
    который используется для проверки IP-адресов