Index: django/core/formfields.py
===================================================================
--- django/core/formfields.py	(revision 2518)
+++ django/core/formfields.py	(working copy)
@@ -807,13 +807,13 @@
 
 class IPAddressField(TextField):
     def __init__(self, field_name, length=15, maxlength=15, is_required=False, validator_list=[]):
-        validator_list = [self.isValidIPAddress] + validator_list
+        validator_list = [self.isValidIPv4Address] + validator_list
         TextField.__init__(self, field_name, length=length, maxlength=maxlength,
             is_required=is_required, validator_list=validator_list)
 
-    def isValidIPAddress(self, field_data, all_data):
+    def isValidIPv4Address(self, field_data, all_data):
         try:
-            validators.isValidIPAddress4(field_data, all_data)
+            validators.isValidIPv4Address(field_data, all_data)
         except validators.ValidationError, e:
             raise validators.CriticalValidationError, e.messages
 
@@ -821,6 +821,22 @@
         return data or None
     html2python = staticmethod(html2python)
 
+class IPv6AddressField(TextField):
+    def __init__(self, field_name, length=39, maxlength=39, is_required=False, validator_list=[]):
+        validator_list = [self.isValidIPv6Address] + validator_list
+        TextField.__init__(self, field_name, length=length, maxlength=maxlength,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidIPv6Address(self, field_data, all_data):
+        try:
+            validators.isValidIPv6Address(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        return data or None
+    html2python = staticmethod(html2python)
+
 ####################
 # MISCELLANEOUS    #
 ####################
Index: django/core/db/backends/ado_mssql.py
===================================================================
--- django/core/db/backends/ado_mssql.py	(revision 2518)
+++ django/core/db/backends/ado_mssql.py	(working copy)
@@ -150,6 +150,7 @@
     'ImageField':        'varchar(100)',
     'IntegerField':      'int',
     'IPAddressField':    'char(15)',
+    'IPv6AddressField':   'char(39)',
     'ManyToManyField':   None,
     'NullBooleanField':  'bit',
     'OneToOneField':     'int',
Index: django/core/db/backends/postgresql.py
===================================================================
--- django/core/db/backends/postgresql.py	(revision 2518)
+++ django/core/db/backends/postgresql.py	(working copy)
@@ -200,6 +200,7 @@
     'ImageField':        'varchar(100)',
     'IntegerField':      'integer',
     'IPAddressField':    'inet',
+    'IPv6AddressField':   'inet',
     'ManyToManyField':   None,
     'NullBooleanField':  'boolean',
     'OneToOneField':     'integer',
Index: django/core/db/backends/sqlite3.py
===================================================================
--- django/core/db/backends/sqlite3.py	(revision 2518)
+++ django/core/db/backends/sqlite3.py	(working copy)
@@ -174,6 +174,7 @@
     'ImageField':                   'varchar(100)',
     'IntegerField':                 'integer',
     'IPAddressField':               'char(15)',
+    'IPv6AddressField':              'char(39)',
     'ManyToManyField':              None,
     'NullBooleanField':             'bool',
     'OneToOneField':                'integer',
Index: django/core/db/backends/mysql.py
===================================================================
--- django/core/db/backends/mysql.py	(revision 2518)
+++ django/core/db/backends/mysql.py	(working copy)
@@ -184,6 +184,7 @@
     'ImageField':        'varchar(100)',
     'IntegerField':      'integer',
     'IPAddressField':    'char(15)',
+    'IPv6AddressField':   'char(39)',
     'ManyToManyField':   None,
     'NullBooleanField':  'bool',
     'OneToOneField':     'integer',
Index: django/core/meta/fields.py
===================================================================
--- django/core/meta/fields.py	(revision 2518)
+++ django/core/meta/fields.py	(working copy)
@@ -580,6 +580,14 @@
     def get_manipulator_field_objs(self):
         return [formfields.IPAddressField]
 
+class IPv6AddressField(Field):
+    def __init__(self, *args, **kwargs):
+        kwargs['maxlength'] = 39
+        Field.__init__(self, *args, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [formfields.IPv6AddressField]
+
 class NullBooleanField(Field):
     def __init__(self, *args, **kwargs):
         kwargs['null'] = True
Index: django/core/validators.py
===================================================================
--- django/core/validators.py	(revision 2518)
+++ django/core/validators.py	(working copy)
@@ -19,7 +19,12 @@
 ansi_datetime_re = re.compile('^%s %s$' % (_datere, _timere))
 email_re = re.compile(r'^[A-Z0-9._%-][+A-Z0-9._%-]*@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}$', re.IGNORECASE)
 integer_re = re.compile(r'^-?\d+$')
-ip4_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}$')
+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}$')
+_ipv6_hex_re = r'(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}'
+_ipv6_hex_compressed_re = r'((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)'
+_ipv6_ipv4_compat_re = r'((?:[0-9A-Fa-f]{1,4}:){6,6})(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}'
+_ipv6_ipv4_compat_compressed_re = r'((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}:)*)(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}'
+ipv6_re = re.compile('^(%s|%s|%s|%s)$' % (_ipv6_hex_re, _ipv6_hex_compressed_re, _ipv6_ipv4_compat_re, _ipv6_ipv4_compat_compressed_re))
 phone_re = re.compile(r'^[A-PR-Y0-9]{3}-[A-PR-Y0-9]{3}-[A-PR-Y0-9]{4}$', re.IGNORECASE)
 slug_re = re.compile(r'^[-\w]+$')
 url_re = re.compile(r'^https?://\S+$')
@@ -95,10 +100,18 @@
         except ValidationError:
             raise ValidationError, _("Enter valid e-mail addresses separated by commas.")
 
-def isValidIPAddress4(field_data, all_data):
-    if not ip4_re.search(field_data):
-        raise ValidationError, _("Please enter a valid IP address.")
+def isValidIPAddress(field_data, all_data):
+    if not (ipv4_re.search(field_data) or ipv6_re.search(field_data)):
+        raise ValidationError, _("Please enter a valid IPv4 or IPv6 address.")
 
+def isValidIPv4Address(field_data, all_data):
+    if not ipv4_re.search(field_data):
+        raise ValidationError, _("Please enter a valid IPv4 address.")
+
+def isValidIPv6Address(field_data, all_data):
+    if not ipv6_re.search(field_data):
+        raise ValidationError, _("Please enter a valid IPv6 address.")
+
 def isNotEmpty(field_data, all_data):
     if field_data.strip() == '':
         raise ValidationError, _("Empty values are not allowed here.")
