Когда пользователь не может войти в систему (например, из-за того, что он ввел неверный пароль), страница перезагружается и показывает, что пароль неверен, затем, когда пользователь снова перезагружает страницу, на странице будет сгенерирована та же форма с теми же заполненными полями и с той же ошибкой. . Проблема в том, что каким-то образом после перезагрузки метод все еще POST. Почему? Я хочу, чтобы форма очищалась при перезагрузке страницы.
Я новичок в Django, поэтому надеюсь, что кто-нибудь может мне помочь!
просмотры.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})
формы.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>
После перезагрузки страницы с заполненной формой с ошибкой в программе функции входа в систему (или что-то еще) перейдите к первому условию (request.method == 'POST'), затем к следующему условию (form.is_valid()), которое возвращает True, затем он переходит к «если пользователь не None», переходит к другому и отображает страницу с заполненной формой с ошибкой.
Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.
назначьте свою форму:
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})######
Не работает. Условие «if form.is_valid()» возвращает True, и программа проходит через него, затем проверяет «если пользователь не None», что возвращает False, затем переходит к else и отображает мою форму с помощью «form=LogInForm(request.POST) "
Я пропустил это, также измените:
else:
messages.error(request, "Invalid login or password")
return render(request, 'logIn.html', {"form": form})####
к:
else:
messages.error(request, "Invalid login or password")
return redirect("login")####
Попробуй это. Если это все еще не работает, покажите мне ошибку, которую вы получаете.
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.',
}
Чувак, если у тебя есть достаточно времени, можешь ли ты помочь мне с регистрационной формой? Потому что у меня тоже такая же проблема. Я просто не понимаю, как это работает. Возможно, это из-за моего класса SignUpForm, куда я добавляю ошибки вроде этого "self.add_error(None, "Пароли не совпадают")", может быть есть различия между add_error и messages.error, я имею в виду, как они работают
Я добавил это к своему последнему ответу. Также, вероятно, чище, если вы добавите свои поля и виджеты таким образом.
Хорошо, я переформулирую свой вопрос. Как я могу «вернуть рендеринг (запрос, 'logIn.html', {"form": form})» сделать запрос GET, а не POST? Потому что после перезагрузки я получаю сообщения такого типа в консоли "[21/Feb/2023 09:18:18] "POST /login?next=/ HTTP/1.1" 200 13267"