enter a value in input and submitting the form getting error message which I set in form validation, but when the page is refreshed I'm getting previous data which was entered in same input.
view.py:
from django.forms import ValidationError
from . import forms
from django.shortcuts import render,redirect
from django.contrib.auth import authenticate,login,logout
from django.core import validators
def user_login(request):
if request.method == 'POST':
form = forms.LoginForm(request.POST.dict())
print(request.POST)
if form.is_valid():
# Handle valid form submission
username=form.cleaned_data['name']
password=form.cleaned_data['password']
user=authenticate(username=username,password=password)
if user is not None:
login(request,user)
return redirect(home)
elif user is None :
raise ValidationError('required')
else:
form = forms.LoginForm()
return render(request, "login.html", context={'form': form})
def home(request):
if request.user.is_authenticated:
return render(request,"home.html")
return redirect(user_login)
def user_logout(request):
if request.user.is_authenticated and request.META.get('HTTP_REFERER') is not None:
logout(request)
return redirect(home)
login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>login</title>
{% load bootstrap5 %}
{% bootstrap_css %}
{% bootstrap_javascript %}
</head>
<body>
<div class=" w-50 container " style="border-radius: 20px; background-color: darkgrey;">
<h1 class="mt-5 pt-5 mb-0 text-center ">login</h1>
<div class="h-100 d-flex align-items-center justify-content-center ">
<form class="w-50 m-5 container" method="post">
{% csrf_token %}
{{ form.name.label_tag }} {{ form.name }}
<div class="error-message" style="color:red">{{ form.name.errors }}</div>
{{ form.password.label_tag }} {{ form.password }}
<div class="error-message">{{ form.password.errors }}</div>
<button type="submit" class="btn btn-primary mt-1">Login</button>
</form>
<!-- <form class="w-50 m-5 container" method="post" enctype="multipart/form-data" >
{%csrf_token%}
<label for="exampleFormControlSelect1">Username</label>
<input type="text" class="form-control mb-3" placeholder="Username" name="username" required>
<p>{{message}}</p>
<label for="password">password</label>
<input class="form-control mb-3" type="password" name="password" placeholder="password" required></input>
<button type="submit" class="btn btn-primary mt-1" onclick="">login</button>
</form> -->
</div>
</div>
</div>
</body>
</html>
form.py:
from django import forms
from django.core import validators
def requiredCheck(value):
if value is None:
raise forms.ValidationError('required')
class LoginForm(forms.Form):
name= forms.CharField(required=False,validators=[validators.MinLengthValidator(4,"enter minimum 4 characters"),requiredCheck],widget=forms.TextInput(attrs = {'class':"form-control mb-3",'placeholder':"Username"}))
password=forms.CharField(required=False,widget=forms.PasswordInput(attrs = {'class':"form-control mb-3",'placeholder':"password"}))
urls.py:
from . import views
from django.urls import path
urlpatterns = [
path('',views.user_login ,name='login'),
path('home/',views.home ,name='home'),
path('logout',views.user_logout,name='logout')
]
I want to get a fresh data when refresh the page and validate in the form. I tried to assign something in request.POST. Please help me
One the major reasons can be form autocomplete. If you don't want autocomplete only for one input:
<form action="/action_page.php" autocomplete="on">
First name:<input type="text" name="fname"><br>
Last name: <input type="text" name="lname"><br>
E-mail: <input type="email" name="email" autocomplete="off"><br>
<input type="submit">
</form>
If you want to disable autocomplete for all inputs in a specific form:
<form method="get" autocomplete="off">
First name:<input type="text" name="fname"><br>
E-mail: <input type="email" name="email"><br>
<input type="submit">
</form>
You can read more about this at w3schools.