Nabeel Ayub
Nabeel Ayub

Reputation: 1250

Show error message if password and username incorrect in Django form_template

I am trying to show an error when the user enters wrong login credentials using form_template. So far I tried the below approach but it is not working.

Forms.py:

class UserForm(forms.Form):
    username=forms.CharField(max_length=50)
    password=forms.CharField(widget=forms.PasswordInput)

    model=User
    fields=['username', 'password']

Views.py:

class loginform(View):

    template_name='essay/Login.html'
    form_class=UserForm

    def get(self,request):     # if the request is get then only view the function
        form=self.form_class(None)
        return render(request, self.template_name, {'form': form})

    def post(self,request):
        form=self.form_class(request.POST)
        if form.is_valid():
            #user = form.save(commit=False)  # it doesnot save in database, it is used to et clean the values
            # clean data
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']

            # authenticate user:
            user = authenticate(username=username, password=password)

            if user is not None:
                login(request, user)
                if(request.user.is_prof==True):
                    return redirect('essay:file', )
                else:
                    return redirect('essay:stdprofile')
            else:
                return render(request,self.template_name, {
                    'error_message': ' Login Failed! Enter the username and password correctly', })
        else:
            msg = 'Errors: %s' % form.errors.as_text()
            return HttpResponse(msg, status=400)

        return render(request, self.template_name, {'form': form})

Form_template:

{% for field in form %}
 <div class="form-group">
  <label class="control-label col-sm-2">{{ field.label_tag }}</label> 
  <div class="col-sm-10">{{ field }}</div>   <!-- inputs on the rigth -->
 </div>
{% endfor %}  

Login.html:

<body>
    <div class="login-card">
      <h1>Log-in</h1><br>
      <form class="form-horizontal" action="" method="POST" enctype="multiport/form-data">
          {% csrf_token %}
          {% include 'essay/form_template.html' %}
          <input type="submit" name="login" class="login login-submit" value="login">
      </form>
      {% error_message %}
    </div>

</body>

The problem I got when I enter invalid credentials, username and password fields vanish and it also does not display the error message.

Upvotes: 0

Views: 8441

Answers (2)

Bidhan Majhi
Bidhan Majhi

Reputation: 1370

In your field in form page add,

{{field.errors}}

or under csrf tag add,

{{form.errors}}

This will show all your field errors, for non field errors add,

{{form.non_field_errors}}

Also, you can also use Django builtin messages to display your custom message.

Upvotes: 3

L&#250;cio Henrique
L&#250;cio Henrique

Reputation: 31

The error is because you are using {% error_message %}in your template, when the correct is {{ error_message }}.

Plus, why not use Django messages?

You also can easily include message on Class Based Views - see here

Upvotes: 0

Related Questions