formfields.py 859 B

1234567891011121314151617181920212223242526272829303132
  1. from __future__ import unicode_literals
  2. from netaddr import IPNetwork, AddrFormatError
  3. from django import forms
  4. from django.core.exceptions import ValidationError
  5. #
  6. # Form fields
  7. #
  8. class IPFormField(forms.Field):
  9. default_error_messages = {
  10. 'invalid': "Enter a valid IPv4 or IPv6 address (with CIDR mask).",
  11. }
  12. def to_python(self, value):
  13. if not value:
  14. return None
  15. if isinstance(value, IPNetwork):
  16. return value
  17. # Ensure that a subnet mask has been specified. This prevents IPs from defaulting to a /32 or /128.
  18. if len(value.split('/')) != 2:
  19. raise ValidationError('CIDR mask (e.g. /24) is required.')
  20. try:
  21. return IPNetwork(value)
  22. except AddrFormatError:
  23. raise ValidationError("Please specify a valid IPv4 or IPv6 address.")