Django form. POST request

Question:

When user cannot log in(because he entered a wrong password for example) page reloads and shows that password incorrect, then, when user reloads page again, the same form with the same completed fields and with the same error will be generated on the page. Problem is, that somehow after reloading method is still POST. Why? I want form to clear itself when I reload a page.

I’m new at Django, so, I hope somebody can help me!

views.py

from django.forms import ValidationError
from django.shortcuts import render, redirect
from .forms import LogInForm, SignUpForm
from django.contrib.auth.decorators import login_required
from django.contrib.auth.hashers import make_password
from django.contrib.auth import authenticate, logout, login as auth_login
from django.contrib import messages
from django.http import HttpResponseRedirect, HttpResponse
# Create your views here.


def login(request):
    logInForm = LogInForm()
    if request.method == 'POST':    
        form = LogInForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            user = authenticate(
                username=cd['username'], password=cd['password'])
            if user is not None:
                auth_login(request, user)
                return redirect("home")
            else:
                messages.error(request, "Invalid login or password")
                return render(request, 'logIn.html', {"form": form})
        else:
            return HttpResponse("afs")
    else:
        return render(request, 'logIn.html', {"form": logInForm})


def logout_view(request):
    logout(request)
    return redirect('login')


@login_required
def profile(request):
    return render(request, 'profile.html')


@login_required
def toDoList(request):
    current_user = request.user
    username = current_user.username
    return render(request, 'toDoList.html', {'username': username})


def signUp(request):
    signUpForm = SignUpForm()
    if (request.method == 'POST'):
        form = SignUpForm(request.POST)
        if (form.is_valid()):
            user = form.save(commit=False)
            user.password = make_password('password')
            user.save()
            auth_login(request, user)
            username = user.username
            return render(request, "toDoList.html", {'username': username})
        else:
            return render(request, 'signUp.html', {"form": form})
    else:
        return render(request, 'signUp.html', {"form": signUpForm})

forms.py

from django.forms import ModelForm, ValidationError
from django import forms
from .models import User
from django.contrib.auth.forms import UserCreationForm
from django.contrib import messages

class LogInForm(forms.Form):
    username = forms.CharField(widget=forms.TextInput(
        attrs={'placeholder': 'Username', 'class': 'form-input'}),required=True)
    password = forms.CharField(widget=forms.PasswordInput(
        attrs={'placeholder': 'Password', 'class': 'form-input'}),required=True)
    def check_pass(self):
        cleaned_data = super(SignUpForm, self).clean()
        password = self.cleaned_data.get("password")
        if (password == ''):
            messages.error("Invalid data")
        return cleaned_data


class SignUpForm(ModelForm):
    password = forms.CharField(label='Password', widget=forms.PasswordInput(
        attrs={"placeholder": "Password"}))
    password2 = forms.CharField(
        label='Confirm password', widget=forms.PasswordInput(attrs={"placeholder": "Confirm password"}))

    class Meta:
        model = User
        fields = ('username', 'email', 'phoneNumber','password')
        widgets = {
            "username": forms.TextInput(
                attrs={
                    "placeholder": "Username"
                }
            ),
            "email": forms.TextInput(
                attrs={
                    "placeholder": "Email"
                }
            ),
            "phoneNumber": forms.TextInput(
                attrs={
                    "placeholder": "Phone number (with a country code) ",
                    "type": "tel",
                    "minlength": 12,
                    "maxlength": 12,
                },
            ),
        }

    def clean(self):
        cleaned_data = super(SignUpForm, self).clean()
        password = self.cleaned_data.get("password")
        confirm_password = self.cleaned_data.get("password2")
        if password and confirm_password:
            if password != confirm_password:
                self.add_error(None, "Passwords don't match")
        return cleaned_data

    def checkIfExist(self):
        cleaned_data = super(SignUpForm, self).clean()
        username = self.cleaned_data.get("username")
        email = self.cleaned_data.get("email")
        phoneNumber = self.cleaned_data.get("phoneNumber")
        if User.objects.filter(email.exists()):
            self.add_error('email', "That email already exists")
        if User.objects.filter(username.exists()):
            self.add_error('username', "That username already exists")
        if User.objects.filter(phoneNumber.exists()):
            self.add_error('phoneNumber', "That phone number already exists")
        return cleaned_data

logIn.html

<!DOCTYPE html>
{% load static %}

<html>
    <head>
        <link rel="stylesheet" href="{% static "css/login.css" %}" />
        <link rel="stylesheet"
            href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
        <link rel="icon" href="data:;base64,=">
        <title>To do list</title>
        <style>
            .container{
               background-image: url('{% static "images/background.jpg" %}');
               background-size:100% 100%;
            }
        </style>
    </head>

    <body>
        <div class="container">
            <form action="" class="form" method="post">
                {% csrf_token %}
                <h1 class="title">Log in</h1>
                {{form.as_table}}
                {% if messages %}
                    {% for message in messages %}
                        {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}
                            <div class="message">
                                <span class="message-error">{{ message }}</span>
                            </div>
                        {% endif %}
                    {% endfor %}
                {% endif %}
                <label class="label-checkbox" for="rememberMe">
                    <input type="checkbox" name="rememberMe" class="form-check">
                    Remember me
                </label>
                <div class="wrapper">
                    <button type="submit" class="form-butn">Log in</button>
                    <a class="form-signUp" href="/signUp">Sign Up</a>
                </div>
                {% if form.non_field_errors %}
                <div class="non-field-errors">
                    {% for err in form.non_field_errors %}
                    <span class="form-error">{{ err }}</span>
                    {% endfor %}
                </div>
                {% endif %}
                <div class="div-social">
                    <span>Войти с помощью</span>
                </div>
                <ul class="list">
                    <li class="social">
                        <a href="" class="social-btn">
                            <img class="login" src="{% static "images/google.svg" %}" alt="google">
                        </a>
                    </li>
                    <li class="social">
                        <a href="" class="social-btn">
                            <img class="login" src="{% static "images/tg.svg" %}" alt="telegram">
                        </a>
                    </li>
                    <li class="social">
                        <a href="" class="social-btn">
                            <img class="login" src="{% static "images/vk.svg" %}" alt="vk">
                        </a>
                    </li>
                    <li class="social">
                        <a href="" class="social-btn">
                            <img class="login" src="{% static "images/yandex.png" %}" alt="yandex">
                        </a>
                    </li>
                </ul>
            </form>
        </div>
    </body>
</html>

After reloading page with completed form with error in login function programm(or whatever is this) go through first condition(request.method == ‘POST’), then through next condition(form.is_valid()), which returns True, then it goes to "if user is not None", goes to else and rendering page with completed form with error.

EDIT:

models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, AbstractUser
# Create your models here.


class User(AbstractUser):
    username = models.CharField(max_length=100, unique=True, error_messages={
                                'unique': "This username has already been registered."})
    password = models.CharField(max_length=200, unique=False)
    email = models.EmailField(unique=True, error_messages={
                              'unique': "This email has already been registered."})
    phoneNumber = models.CharField(max_length=12, unique=True, error_messages={
                                   'unique': "This phone number has already been registered."})
    first_name = None
    last_name = None

signUp.html

<!DOCTYPE html>
{% load static %}
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="{% static "css/signUp.css" %}" />
        <title>Sign up</title>
    </head>
    <body>
        <div class="container">
            <form class="form" method="post">
                <h1 class="title">Sign up</h1>
                {% csrf_token %}
                {% for field in form %}
                    {{ field }}
                    {% if field.errors %}
                        {% for error in field.errors %}
                            <span class="message-error"> {{ error }} </span>
                        {% endfor %}
                    {% endif %}
                {% endfor %}
                {% if form.non_field_errors %}
                    {% for non_field_error in form.non_field_errors %}
                        <span class="message-error"> {{ non_field_error }} </span>
                    {% endfor %}
                {% endif %}
                <label for="confirm-valid" class="label-check">
                    <input type="checkbox" id="confirm-valid" required> I've checked the correctness of the entered data
                </label>
                <label for="confirm-agreement" class="label-check">
                    <input type="checkbox" id="confirm-agreement" required> I agree with the user agreement
                </label>
                <button class="form-button" type="submit">Sign up</button>
            </form>
        </div>
    </body>
</html>
Asked By: kirin

||

Answers:

assign your form:

def login(request):
    logInForm = LogInForm()
    if request.method == 'POST':    
        form = LogInForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            user = authenticate(
                username=cd['username'], password=cd['password'])
            if user is not None:
                auth_login(request, user)
                return redirect("home")
            else:
                messages.error(request, "Invalid login or password")
                return render(request, 'logIn.html', {"form": form})
        else:
            form = LogInForm()######
    else:
        return render(request, 'logIn.html', {"form": form})######
Answered By: PolarBear

I missed this, also change:

else:
    messages.error(request, "Invalid login or password")
    return render(request, 'logIn.html', {"form": form})####

to:

else:
    messages.error(request, "Invalid login or password")
    return redirect("login")####

Try this. If it still doesn’t work, show me the error you’re getting.

password1 = forms.CharField(label = False, required = True,error_messages={
        'required': 'Password is required.',
        },
    widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'})
    )

    password2 = forms.CharField(label = False, required = True,error_messages={
        'required': 'Password is required.',
        },
    widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Confirm Password'})
    )

    error_messages = {
        'password_mismatch': 'Passwords must match.',
    }
Answered By: PolarBear

The reason I commented out field.errors is to display the errors at the top only.

signup.html:

{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            <div>{{ error }}</div>
        {% endfor %}
    {% endfor %}
{% endif %}

<form method="post" action="{% url 'signup' %}">
    {% csrf_token %}
        {% for field in form %}
            <p>{{field}}</p>
            {# {{ field.errors }} #}
        {% endfor %}
    <br><br>
    <button class="btn btn-primary" type="submit">Submit</button>
</form>
Answered By: PolarBear
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.