Index: django/contrib/auth/tests.py
===================================================================
--- django/contrib/auth/tests.py	(revision 6962)
+++ django/contrib/auth/tests.py	(working copy)
@@ -35,4 +35,8 @@
 []
 >>> a.user_permissions.all()
 []
-"""
+
+>>> u3 = User.objects.create_user('testuser3@example.com', 'test3@example.com', 'test3')
+>>> u3.username = 'testuser3a@example.com'
+>>> u3.save()
+"""
Index: django/contrib/auth/models.py
===================================================================
--- django/contrib/auth/models.py	(revision 6962)
+++ django/contrib/auth/models.py	(working copy)
@@ -128,7 +128,7 @@
 
     Username and password are required. Other fields are optional.
     """
-    username = models.CharField(_('username'), max_length=30, unique=True, validator_list=[validators.isAlphaNumeric], help_text=_("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."))
+    username = models.CharField(_('username'), max_length=30, unique=True, help_text=_("Required. 30 characters or fewer."))
     first_name = models.CharField(_('first name'), max_length=30, blank=True)
     last_name = models.CharField(_('last name'), max_length=30, blank=True)
     email = models.EmailField(_('e-mail address'), blank=True)
Index: django/contrib/auth/forms.py
===================================================================
--- django/contrib/auth/forms.py	(revision 6962)
+++ django/contrib/auth/forms.py	(working copy)
@@ -11,7 +11,7 @@
     def __init__(self):
         self.fields = (
             oldforms.TextField(field_name='username', length=30, max_length=30, is_required=True,
-                validator_list=[validators.isAlphaNumeric, self.isValidUsername]),
+                validator_list=[self.isValidUsername]),
             oldforms.PasswordField(field_name='password1', length=30, max_length=60, is_required=True),
             oldforms.PasswordField(field_name='password2', length=30, max_length=60, is_required=True,
                 validator_list=[validators.AlwaysMatchesOtherField('password1', _("The two password fields didn't match."))]),
Index: tests/regressiontests/auth_backends/tests.py
===================================================================
--- tests/regressiontests/auth_backends/tests.py	(revision 6962)
+++ tests/regressiontests/auth_backends/tests.py	(working copy)
@@ -69,4 +69,11 @@
 True
 >>> user.has_perms(['auth.test3', 'auth.test_group'])
 True
+
+>>> user = User.objects.create_user('test2@example.com', 'test2@example.com', 'test')
+>>> user = User.objects.get(username="test2@example.com")
+>>> user.username
+u'test2@example.com'
+>>> user.username = 'test2a@example.com'
+>>> user.save()
 """}
Index: docs/authentication.txt
===================================================================
--- docs/authentication.txt	(revision 6962)
+++ docs/authentication.txt	(working copy)
@@ -56,8 +56,8 @@
 
 ``User`` objects have the following fields:
 
-    * ``username`` -- Required. 30 characters or fewer. Alphanumeric characters
-      only (letters, digits and underscores).
+    * ``username`` -- Required. 30 characters or fewer. May contain any
+      character.
     * ``first_name`` -- Optional. 30 characters or fewer.
     * ``last_name`` -- Optional. 30 characters or fewer.
     * ``email`` -- Optional. E-mail address.
