1

In my register form I added a validation error when there is a duplicate username or email, but it is not working in my template.

forms.py :

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django import forms


class RegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

    def clean_username(self):
        username = self.cleaned_data.get("username")
        if User.objects.filter(username=username).exists():
            raise forms.ValidationError("Username is not unique")
        return username

    def clean_email(self):
        email = self.cleaned_data.get("email")
        if User.objects.filter(email=email).exists():
            raise forms.ValidationError("Email is not unique")
        return email

the template:

   <body>
    <div class="container">
    <h1>Register</h1>
    <form action="" method="post">
        {% csrf_token %}
        <label for="username">Username</label><br>
        {{forms.username}} <br>
        <label for="email">Email</label><br>
        {{forms.email}} <br>
        <label for="password1">Password</label><br>
        {{forms.password1}} <br>
        <label for="password2">Confirm Password</label><br>
        {{forms.password2}} <br>

        {% if form.errors %}
        {% for field in form %}
            {% for error in field.errors %}
                {{ error|escape }}
            {% endfor %}
        {% endfor %}
        {% for error in form.non_field_errors %}
            {{ error|escape }}
        {% endfor %}
        {% endif %} <br><br>
        <input type="submit" value="Register">
    </form>
</div>
</body>

views.py:

from django.shortcuts import render
from .forms import RegisterForm
# Create your views here.

def register(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)        
        if form.is_valid():
            form.save()
    else:
        form = RegisterForm()
    
    context = {'forms':form}
    return render(request, 'register/register.html', context)

When I run the page and put a duplicate email then no validation error is raised, it just reloads the page removing the email or the username.

2
  • 1
    Can we see your views.py file. Commented Dec 23, 2020 at 11:09
  • your Form is passed in context as forms and not form Commented Dec 23, 2020 at 11:14

1 Answer 1

2

In "register view" you set context:

context = {'forms':form}

But in the template, you use "form.errors":

{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            {{ error|escape }}
        {% endfor %}
    {% endfor %}
    {% for error in form.non_field_errors %}
        {{ error|escape }}
    {% endfor %}
{% endif %} <br><br>

You must change "form.errors" to "forms.errors" in the template.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.