Index: django/core/formfields.py
===================================================================
--- django/core/formfields.py	(revision 1262)
+++ django/core/formfields.py	(working copy)
@@ -712,6 +712,22 @@
         return data or None
     html2python = staticmethod(html2python)
 
+class IP6AddressField(TextField):
+    def __init__(self, field_name, length=39, maxlength=39, is_required=False, validator_list=[]):
+        validator_list = [self.isValidIPAddress] + 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):
+        try:
+            validators.isValidIPAddress6(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 1262)
+++ django/core/db/backends/ado_mssql.py	(working copy)
@@ -145,6 +145,7 @@
     'ImageField':        'varchar(100)',
     'IntegerField':      'int',
     'IPAddressField':    'char(15)',
+    'IP6AddressField':   'char(39)',
     'ManyToManyField':   None,
     'NullBooleanField':  'bit',
     'OneToOneField':     'int',
Index: django/core/db/backends/postgresql.py
===================================================================
--- django/core/db/backends/postgresql.py	(revision 1262)
+++ django/core/db/backends/postgresql.py	(working copy)
@@ -166,6 +166,7 @@
     'ImageField':        'varchar(100)',
     'IntegerField':      'integer',
     'IPAddressField':    'inet',
+    'IP6AddressField':   'inet',
     'ManyToManyField':   None,
     'NullBooleanField':  'boolean',
     'OneToOneField':     'integer',
Index: django/core/db/backends/sqlite3.py
===================================================================
--- django/core/db/backends/sqlite3.py	(revision 1262)
+++ django/core/db/backends/sqlite3.py	(working copy)
@@ -164,6 +164,7 @@
     'ImageField':                   'varchar(100)',
     'IntegerField':                 'integer',
     'IPAddressField':               'char(15)',
+    'IP6AddressField':              'char(39)',
     'ManyToManyField':              None,
     'NullBooleanField':             'bool',
     'OneToOneField':                'integer',
Index: django/core/db/backends/mysql.py
===================================================================
--- django/core/db/backends/mysql.py	(revision 1262)
+++ django/core/db/backends/mysql.py	(working copy)
@@ -161,6 +161,7 @@
     'ImageField':        'varchar(100)',
     'IntegerField':      'integer',
     'IPAddressField':    'char(15)',
+    'IP6AddressField':   'char(39)',
     'ManyToManyField':   None,
     'NullBooleanField':  'bool',
     'OneToOneField':     'integer',
Index: django/core/meta/fields.py
===================================================================
--- django/core/meta/fields.py	(revision 1262)
+++ django/core/meta/fields.py	(working copy)
@@ -507,6 +507,14 @@
     def get_manipulator_field_objs(self):
         return [formfields.IPAddressField]
 
+class IP6AddressField(Field):
+    def __init__(self, *args, **kwargs):
+        kwargs['maxlength'] = 15
+        Field.__init__(self, *args, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [formfields.IP6AddressField]
+
 class NullBooleanField(Field):
     def __init__(self, *args, **kwargs):
         kwargs['null'] = True
Index: django/core/validators.py
===================================================================
--- django/core/validators.py	(revision 1262)
+++ django/core/validators.py	(working copy)
@@ -21,6 +21,11 @@
 email_re = re.compile(r'^((([\t\x20]*[!#-\'\*\+\-/-9=\?A-Z\^-~]+[\t\x20]*|"[\x01-\x09\x0B\x0C\x0E-\x21\x23-\x5B\x5D-\x7F]*")+)?[\t\x20]*<([\t\x20]*[!#-\'\*\+\-/-9=\?A-Z\^-~]+(\.[!#-\'\*\+\-/-9=\?A-Z\^-~]+)*|"[\x01-\x09\x0B\x0C\x0E-\x21\x23-\x5B\x5D-\x7F]*")@(([a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9]\.)+[a-zA-Z]{2,}|\[(([0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\])>[\t\x20]*|([\t\x20]*[!#-\'\*\+\-/-9=\?A-Z\^-~]+(\.[!#-\'\*\+\-/-9=\?A-Z\^-~]+)*|"[\x01-\x09\x0B\x0C\x0E-\x21\x23-\x5B\x5D-\x7F]*")@(([a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9]\.)+[a-zA-Z]{2,}|\[(([0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\]))$')
 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}$')
+_ip6_hex_re = r'(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}'
+_ip6_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})*)?)'
+_ip6_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}'
+_ip6_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}'
+ip6_re = re.compile('^(%s|%s|%s|%s)$' % (_ip6_hex_re, _ip6_hex_compressed_re, _ip6_ipv4_compat_re, _ip6_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'^http://\S+$')
@@ -93,10 +98,18 @@
         except ValidationError:
             raise ValidationError, _("Enter valid e-mail addresses separated by commas.")
 
+def isValidIPAddress(field_data, all_data):
+    if not (ip4_re.search(field_data) or ip6_re.search(field_data)):
+        raise ValidationError, _("Please enter a valid IPv4 or IPv6 address.")
+
 def isValidIPAddress4(field_data, all_data):
     if not ip4_re.search(field_data):
-        raise ValidationError, _("Please enter a valid IP address.")
+        raise ValidationError, _("Please enter a valid IPv4 address.")
 
+def isValidIPAddress6(field_data, all_data):
+    if not ip6_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.")
