Ravi Shankar
Ravi Shankar

Reputation: 377

Showing error messages in template in DefaultUserCreationForm - django

I am having a problem in displaying an error message in the HTML page. I am using Django's default UserCreationForm for signup page. It has two password fields - one original and one for confirmation. When the user enters different passwords, I am getting Value Error at /signup/ whereas I want the error message to be displayed in the HTML page saying that the passwords didn't match. I have gone through the docs and I have added some related lines in my code, I don't know where I'm going wrong.

Here is my views.py:

def adduser(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        print(request.POST)

        if(form.is_valid):
            try:
                user = employees.objects.get(emp_id=request.POST['username'] )
            except employees.DoesNotExist:
                user = None

            print(user)
            if( user != None ):
                if request.POST['username'] in  employees.objects.values_list('manager_id__emp_id',flat=True):
                    g = Group.objects.get(name='Managers')
                    newuser = form.save()
                    newuser.groups.add(g)
                else:
                    g = Group.objects.get(name='Employees')
                    newuser = form.save()
                    newuser.groups.add(g)

                return render(request,'login.html',{'form': form})
            else:
                form = UserCreationForm()
                return render(request,'signup.html', {'form': form, 'msg': 'Enter valid employee id'})
    else:
        form = UserCreationForm()

        return render(request,'signup.html', {'form': form})

and here is my signup.html:

<body>
    <div class="container">
        <div class="page-header">
            <h1>Sign-up Here</h1>      
        </div>
        {% block body %}


        <form method="post">
          {% csrf_token %}
          <font color="orange" size="5px"><p> * Enter your Employee id, as username * </p></font>
          {{ form.as_p }}
          <font  color="red"> {{ msg }} </font><br>
          <font  color="red"> {{ form.password1.errors }} </font><br>
          <font  color="red"> {{ form.password2.errors }} </font><br>

          <br>
          <button class="btn btn-success" type="submit"> Go! </button>
        </form>

        {% endblock %}    

    </div>
</body>

Upvotes: 3

Views: 4634

Answers (1)

Prakhar Trivedi
Prakhar Trivedi

Reputation: 8526

The problem is in this line :

if(form.is_valid):

This is not the correct way of testing form validation, instead use:

if form.is_valid():

Also you dont need to declare form multiple times,it can be done single time. Like this :

def adduser(request):
    form = UserCreationForm(request.POST or None)
    if request.method == 'POST':
        print(request.POST)
        if form.is_valid():
            try:
                user = employees.objects.get(emp_id=request.POST['username'] )
            except employees.DoesNotExist:
                user = None

            print(user)
            if( user != None ):
                if request.POST['username'] in  employees.objects.values_list('manager_id__emp_id',flat=True):
                    g = Group.objects.get(name='Managers')
                    newuser = form.save()
                    newuser.groups.add(g)
                else:
                    g = Group.objects.get(name='Employees')
                    newuser = form.save()
                    newuser.groups.add(g)

                return render(request,'login.html',{'form': form})
            else:
                form = UserCreationForm()
                return render(request,'signup.html', {'form': form, 'msg': 'Enter valid employee id'})
    return render(request,'signup.html', {'form': form})

And there can be diffrenmt type of erros, field and non_field_errors, so use someting like this :

{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            <div class="alert alert-danger">
                <strong>{{ error|escape }}</strong>
            </div>
        {% endfor %}
    {% endfor %}
    {% for error in form.non_field_errors %}
        <div class="alert alert-danger">
            <strong>{{ error|escape }}</strong>
        </div>
    {% endfor %}
{% endif %}

Upvotes: 4

Related Questions