formfields.py 818 B

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