diff -uNr --exclude=.svn django-trunk/django/contrib/auth/forms.py django-5786/django/contrib/auth/forms.py
--- django-trunk/django/contrib/auth/forms.py	2010-02-16 17:41:16.044124770 -0600
+++ django-5786/django/contrib/auth/forms.py	2010-02-16 17:39:35.904133694 -0600
@@ -11,9 +11,9 @@
     """
     A form that creates a user, with no privileges, from the given username and password.
     """
-    username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^\w+$',
-        help_text = _("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."),
-        error_message = _("This value must contain only letters, numbers and underscores."))
+    username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^[\w.@+-]+$',
+        help_text = _("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."),
+        error_message = _("This value may contain only letters, numbers and @/./+/-/_ characters."))
     password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
     password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput,
         help_text = _("Enter the same password as above, for verification."))
@@ -45,9 +45,9 @@
         return user
 
 class UserChangeForm(forms.ModelForm):
-    username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^\w+$',
-        help_text = _("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."),
-        error_message = _("This value must contain only letters, numbers and underscores."))
+    username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^[\w.@+-]+$',
+        help_text = _("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."),
+        error_message = _("This value may contain only letters, numbers and @/./+/-/_ characters."))
     
     class Meta:
         model = User
diff -uNr --exclude=.svn django-trunk/django/contrib/auth/models.py django-5786/django/contrib/auth/models.py
--- django-trunk/django/contrib/auth/models.py	2010-02-16 17:41:16.040123059 -0600
+++ django-5786/django/contrib/auth/models.py	2010-02-16 17:39:35.904133694 -0600
@@ -177,7 +177,7 @@
 
     Username and password are required. Other fields are optional.
     """
-    username = models.CharField(_('username'), max_length=30, unique=True, 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. Letters, numbers and @/./+/-/_ characters"))
     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)
diff -uNr --exclude=.svn django-trunk/django/contrib/auth/tests/forms.py django-5786/django/contrib/auth/tests/forms.py
--- django-trunk/django/contrib/auth/tests/forms.py	2010-02-16 17:25:43.936133999 -0600
+++ django-5786/django/contrib/auth/tests/forms.py	2010-02-16 18:45:26.460133386 -0600
@@ -21,7 +21,7 @@
 # The username contains invalid data.
 
 >>> data = {
-...     'username': 'jsmith@example.com',
+...     'username': 'jsmith!',
 ...     'password1': 'test123',
 ...     'password2': 'test123',
 ... }
@@ -29,7 +29,7 @@
 >>> form.is_valid()
 False
 >>> form["username"].errors
-[u'This value must contain only letters, numbers and underscores.']
+[u'This value may contain only letters, numbers and @/./+/-/_ characters.']
 
 # The verification password is incorrect.
 
@@ -65,7 +65,7 @@
 # The success case.
 
 >>> data = {
-...     'username': 'jsmith2',
+...     'username': 'jsmith2@example.com',
 ...     'password1': 'test123',
 ...     'password2': 'test123',
 ... }
@@ -73,7 +73,7 @@
 >>> form.is_valid()
 True
 >>> form.save()
-<User: jsmith2>
+<User: jsmith2@example.com>
 
 # The user submits an invalid username.
 
@@ -189,7 +189,7 @@
 >>> form.is_valid()
 False
 >>> form['username'].errors
-[u'This value must contain only letters, numbers and underscores.']
+[u'This value may contain only letters, numbers and @/./+/-/_ characters.']
 
 
 ### PasswordResetForm
