Django 1.9 check if email already exists
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
.
Related videos on Youtube
Lefty
Updated on June 04, 2022Comments
-
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 over 7 yearsThis 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 over 7 yearsI'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. almost 7 yearsI think this is rather
match = User.objects.get(email=email)
. -
tredzko almost 7 years@GeoffreyR. Thanks, I didn't notice I had a different argument. I've updated my answer.
-
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 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 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 over 5 yearsI'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.