Login

Django Registration without username

Author:
newmaniese
Posted:
April 6, 2008
Language:
Python
Version:
.96
Tags:
registration auth
Score:
3 (after 3 ratings)

A simple adaptation of RegistrationFormUniqueEmail from django-registration http://code.google.com/p/django-registration to allow users to register without using a username. This works great with the code from this comment: http://www.djangosnippets.org/snippets/74/#c195 to allow users to completely eliminate the need for a username.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class RegistrationFormNoUserName(RegistrationFormUniqueEmail):
    """
    A registration form that only requires the user to enter their e-mail 
    address and password. The username is automatically generated
    This class requires django-registration to extend the 
    RegistrationFormUniqueEmail
    """ 
    username = forms.CharField(widget=forms.HiddenInput, required=False)

    def clean_username(self):
        "This function is required to overwrite an inherited username clean"
        return self.cleaned_data['username']

    def clean(self):
        if not self.errors:
            self.cleaned_data['username'] = '%s%s' % (self.cleaned_data['email'].split('@',1)[0], User.objects.count())
        super(RegistrationFormNoUserName, self).clean()
        return self.cleaned_data

More like this

Comments

gwrtheyrn (on September 6, 2011):
<p>I updated the username generation a little... Didn't really like the solution with the total user count.</p> <pre>if not self.errors: localpart = self.cleaned_data['email'].split('@',1)[0][:25] c = User.objects.filter(username=localpart).count() if c > 1: localpart += c self.cleaned_data['username'] = localpart </pre>

#

gwrtheyrn (on September 12, 2011):
<p>Actually the code in my last comment was buggy. Working version:</p> <pre>if not self.errors: localpart = self.cleaned_data['email'].split('@',1)[0][:25] c = User.objects.filter(username=localpart).count() if c > 0: localpart += str(c + 1) self.cleaned_data['username'] = localpart </pre>

#

dsaracini (on June 13, 2012):
<p>The solution above will only work the first time a duplicate is found. For example, if [email protected] registers, his username will be "joe". If [email protected] tries to register, it will find "joe" and will get a count of 1 and username will be "joe2". However, if [email protected] tries to register, the local part will be "joe". It will still get a count of 1 and it will try to set username to joe2 and your application will get an error. This is because filter is "username=joe" (thus, not finding "joe2"). A better solution, and one that will prevent this error is:</p> <p>c = User.objects.filter(username__startswith=localpart).count()</p>

#

Please login first before commenting.