Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 16150)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -1126,10 +1126,10 @@
 class URLField(CharField):
     description = _("URL")
 
-    def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
+    def __init__(self, verbose_name=None, name=None, verify_exists=True, timeout=None, **kwargs):
         kwargs['max_length'] = kwargs.get('max_length', 200)
         CharField.__init__(self, verbose_name, name, **kwargs)
-        self.validators.append(validators.URLValidator(verify_exists=verify_exists))
+        self.validators.append(validators.URLValidator(verify_exists=verify_exists, timeout=timeout))
 
     def formfield(self, **kwargs):
         # As with CharField, this will cause URL validation to be performed twice
Index: django/forms/fields.py
===================================================================
--- django/forms/fields.py	(revision 16150)
+++ django/forms/fields.py	(working copy)
@@ -570,10 +570,9 @@
     }
 
     def __init__(self, max_length=None, min_length=None, verify_exists=False,
-            validator_user_agent=validators.URL_VALIDATOR_USER_AGENT, *args, **kwargs):
-        super(URLField, self).__init__(max_length, min_length, *args,
-                                       **kwargs)
-        self.validators.append(validators.URLValidator(verify_exists=verify_exists, validator_user_agent=validator_user_agent))
+            validator_user_agent=validators.URL_VALIDATOR_USER_AGENT, timeout=None, *args, **kwargs):
+        super(URLField, self).__init__(max_length, min_length, *args, **kwargs)
+        self.validators.append(validators.URLValidator(verify_exists=verify_exists, validator_user_agent=validator_user_agent, timeout=timeout))
 
     def to_python(self, value):
         if value:
Index: django/core/validators.py
===================================================================
--- django/core/validators.py	(revision 16150)
+++ django/core/validators.py	(working copy)
@@ -1,4 +1,6 @@
+import inspect
 import re
+import socket
 import urllib2
 import urlparse
 
@@ -52,10 +54,11 @@
         r'(?::\d+)?' # optional port
         r'(?:/?|[/?]\S+)$', re.IGNORECASE)
 
-    def __init__(self, verify_exists=False, validator_user_agent=URL_VALIDATOR_USER_AGENT):
+    def __init__(self, verify_exists=False, validator_user_agent=URL_VALIDATOR_USER_AGENT, timeout=None):
         super(URLValidator, self).__init__()
         self.verify_exists = verify_exists
         self.user_agent = validator_user_agent
+        self.timeout = timeout
 
     def __call__(self, value):
         try:
@@ -89,7 +92,11 @@
                 _(u'This URL appears to be a broken link.'), code='invalid_link')
             try:
                 req = HeadRequest(url, None, headers)
-                u = urllib2.urlopen(req)
+                if self.timeout is not None and \
+                    'timeout' in inspect.getargspec(urllib2.urlopen).args:
+                    u = urllib2.urlopen(req, timeout=self.timeout)
+                else:
+                    u = urllib2.urlopen(req)
             except ValueError:
                 raise ValidationError(_(u'Enter a valid URL.'), code='invalid')
             except urllib2.HTTPError, e:
@@ -103,7 +110,14 @@
                         raise broken_error
                 else:
                     raise broken_error
-            except: # urllib2.URLError, httplib.InvalidURL, etc.
+            except urllib2.URLError, exc:
+                if isinstance(getattr(exc, 'reason', None), socket.timeout):
+                    raise ValidationError(
+                        _(u'Requesting this URL timed out.'),
+                        code='timed_out')
+                else:
+                    raise broken_error
+            except: # httplib.InvalidURL, etc.
                 raise broken_error
 
 
