Django 1.9 check if email already exists

17,622

You can override the clean_<INSERT_FIELD_HERE>() method on the UserForm to check against this particular case. It'd look something like this:

forms.py:

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('email',)

    def clean_email(self):
        # Get the email
        email = self.cleaned_data.get('email')

        # Check to see if any users already exist with this email as a username.
        try:
            match = User.objects.get(email=email)
        except User.DoesNotExist:
            # Unable to find a user, this is fine
            return email

        # A user was found with this as a username, raise an error.
        raise forms.ValidationError('This email address is already in use.')

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('first_name', 'last_name', 'company', 'website', 'phone_number')

You can read more about cleaning specific fields in a form in the Django documentation about forms.

That said, I think you should look into creating a custom user model instead of treating your User Profile class as a wrapper for User.

Share:
17,622

Related videos on Youtube

Lefty
Author by

Lefty

Updated on June 04, 2022

Comments

  • Lefty
    Lefty almost 2 years

    My site is set up so there is no username (or rather user.username = user.email). Django has an error message if a user tries to input a username that is already in the database, however since I'm not using a username for registration I can't figure out how to do this.

    Just like the default settings already is, I don't want to reload the page to find out if there is an email address already associated with a user. My guess is to use Ajax, but I can't figure out how to do it. Ive looked at other posts, but there doesn't seem to be anything recent.

    How can I check to see if an email address already exists, and if so, give an error message for the user to input a new email address?

    models.py:

    class MyUsers(models.Model):
        user = models.OneToOneField(User)
        first_name = models.CharField(max_length=100, blank=True)
        last_name = models.CharField(max_length=100, blank=True)
        email = models.EmailField(max_length=100, blank=True, unique=True)
        company = models.CharField(max_length=100, blank=True, null=True)
        website = models.URLField(max_length=100, blank=True, null=True)
        phone_number = models.CharField(max_length=100, blank=True, null=True)
    
        def __str__(self):
            return self.user.username
    

    forms.py:

    class UserForm(forms.ModelForm):
        class Meta:
            model = User
            fields = ('email',)
    
    
    class UserProfileForm(forms.ModelForm):
        class Meta:
            model = UserProfile
            fields = ('first_name', 'last_name', 'company', 'website', 'phone_number')
    

    views.py:

    def index(request):
        registered = False
    
        if request.method == 'POST':
            user_form = UserForm(data=request.POST)
            profile_form = UserProfileForm(data=request.POST)
    
            if user_form.is_valid() and profile_form.is_valid():
                user = user_form.save()
                user.set_password(user.password)
                user.password = ""
                user.username = user.email
                user.save()
    
                profile = profile_form.save(commit=False)
                profile.user = user
                profile.email = user.email
                profile.save()
    
                user.first_name = profile.first_name
                user.last_name = profile.last_name
                user.save()
    
                registered = True
                return HttpResponseRedirect(reverse('registration'))
            else:
                print user_form.errors, profile_form.errors
        else:
            user_form = UserForm()
            profile_form = UserProfileForm1()
    
        context = {'user_form': user_form, 'profile_form': profile_form, 'registered': registered}
        return render(request, 'mysite/register.html', context)
    

    register.html:

    {% extends 'mysite/base.html' %}
    {% load staticfiles %}
    
    {% block title_block %}
        Register
    {% endblock %}
    
    {% block head_block %}
    {% endblock %}
    
    {% block body_block %}    
        <form id="user_form" method="post" action="/mysite/" enctype="multipart/form-data">
            {% csrf_token %}
            {{ user_form.as_p }}
            {{ profile_form.as_p }}
    
            <input type="submit" name="submit" value="Register" />
        </form>
    {% endblock %}
    
    • dckuehn
      dckuehn over 7 years
      This is a very broad question. It sounds like you do have code working at some level. Identify the next step, do your best to resolve that, and if you have a more specific problem, we might be able to help you.
    • Lefty
      Lefty over 7 years
      I've added my files to show the code I'm working on. The next step is to figure out how to show a user if they have already put in the same email address, or are accidentally using someone else's email address.
  • Geoffrey R.
    Geoffrey R. almost 7 years
    I think this is rather match = User.objects.get(email=email).
  • tredzko
    tredzko almost 7 years
    @GeoffreyR. Thanks, I didn't notice I had a different argument. I've updated my answer.
  • Udit Hari Vashisht
    Udit Hari Vashisht over 5 years
    @tredzko I am using username as the login credentials, now while updating the profile, it throws email already exists error. How to solve that?
  • tredzko
    tredzko over 5 years
    @UditHariVashisht Check to see if you are updating or not. You can see if there's an instance. If there is an instance, you can compare the email passed in and the email on the instance and only check if they are different. Another option is to use a different form where you exclude the email field, unless changing the email is a desired effect.
  • Udit Hari Vashisht
    Udit Hari Vashisht over 5 years
    @tredzko I am already using two forms (profile and user form) My issue is if I am updating just the first name and not email then also it gives the error of email already exists. request.user can be used but I am not sure where to use it. Have tried various combination but to no success.
  • tredzko
    tredzko over 5 years
    I'd suggest asking a question under the Django tag with some code included for further help. I'm not sure exactly what is triggering your validation based off of your description.