lib/forms_extends.py from django.forms import fields try: from django.conf import settings URL_VALIDATOR_USER_AGENT = settings.URL_VALIDATOR_USER_AGENT except ImportError: # It's OK if Django settings aren't configured. URL_VALIDATOR_USER_AGENT = 'Django (http://www.djangoproject.com/)' ipv4_re = re.compile(r'^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$') url_re = re.compile( r'(?:(?:[A-Z0-9-]+\.)+[A-Z]{2,6}|' #domain... r'localhost|' #localhost... r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip r'(?::\d+)?' # optional port r'(?:/?|/\S+)$', re.IGNORECASE) class IPorURLField(fields.IPAddressField, fields.URLField, RegexField): default_error_messages = { 'invalid': _(u'Enter a valid IPv4 or URL address.'), 'invalid_link': _(u'This URL appears to be a broken link.'), } def __init__(self, max_length=None, min_length=None, verify_exists=False, validator_user_agent=URL_VALIDATOR_USER_AGENT, *args, **kwargs): super(IPAddressField, self).__init__(ipv4_re, *args, **kwargs) super(URLField, self).__init__(url_re, max_length, min_length, *args, **kwargs) self.verify_exists = verify_exists self.user_agent = validator_user_agent def clean(self, value): # If no URL scheme given, assume http:// if value and '://' not in value: value = u'http://%s' % value # If no URL path given, assume / if value and not urlparse.urlsplit(value)[2]: value += '/' value = super(URLField, self).clean(value) if value == u'': return value if self.verify_exists: import urllib2 headers = { "Accept": "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5", "Accept-Language": "en-us,en;q=0.5", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Connection": "close", "User-Agent": self.user_agent, } try: req = urllib2.Request(value, None, headers) u = urllib2.urlopen(req) except ValueError: raise ValidationError(self.error_messages['invalid']) except: # urllib2.URLError, httplib.InvalidURL, etc. raise ValidationError(self.error_messages['invalid_link']) return value lib/models_extends.py from django.db.models.fields import URLField, IPAddressField class IPorURLField(IPAddressField, URLField): empty_strings_allowed = False def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs): kwargs['max_length'] = kwargs.get('max_length', 200) #IPorURLField.__init__(self, verbose_name, name, **kwargs) def get_internal_type(self): return "IPorURLAddressField" def formfield(self, **kwargs): defaults = {'form_class': forms.IPorURLField} defaults.update(kwargs) return super(IPorURLAddressField, self).formfield(**defaults)