Django. Вывод ошибки при валидации формы. Вывод сообщения об успешном выходе
Есть две формы, для входа и регистрации. Есть какая-никакая валидация(недоработанная).
- Проблема 1: Не понимаю как вывести ошибки. Пробовал с помощью add_error - не помогло, пробовал raise ValidationError - не работает. Подскажите, пожалуйста, как это можно реализовать?
- Проблема 2: При выходе из аккаунта сообщение об успешном выходе появляется на странице входа в админку, а не на странице, созданной мной, для входа.
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
# 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 render(request, 'toDoList.html')
else:
return render(request, 'logIn.html', {"form": logInForm})
else:
return render(request, 'logIn.html', {"form": logInForm})
else:
return render(request, 'logIn.html', {"form": logInForm})
def logout_view(request):
logout(request)
messages.success(request, ("You were logged out!"))
return redirect('home')
@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', context={'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)
return render(request, 'toDoList.html')
else:
return render(request, 'signUp.html', {"form": signUpForm})
else:
return render(request, 'signUp.html', {"form": signUpForm})
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
username = models.CharField(max_length=100, unique=True)
password = models.CharField(max_length=200, unique=False)
email = models.EmailField(unique=True)
phoneNumber = models.CharField(max_length=12, unique=True)
is_staff = models.BooleanField(default=False)
forms.py
from django.forms import ModelForm
from django import forms
from .models import User
from django.contrib.auth.forms import UserCreationForm
class LogInForm(forms.Form):
username = forms.CharField(widget=forms.TextInput(
attrs={'placeholder': 'Username', 'class': 'form-input'}))
password = forms.CharField(widget=forms.PasswordInput(
attrs={'placeholder': 'Password', 'class': 'form-input'}))
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:
raise forms.ValidationError(
"The two password fields must 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.fields.add_error('email', "That email already exists")
if User.objects.filter(username.exists()):
self.fields.add_error('username', "That username already exists")
if User.objects.filter(phoneNumber.exists()):
self.fields.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>
{% for field in form %}
{% if field.errors %}
<div class="alert alert-info" role="alert">
{{ field.errors }}
</div>
{% endif %}
{{ field }}
{% endfor %}
<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.svg" %}" alt="yandex">
</a>
</li>
</ul>
</form>
</div>
</body>
</html>
signUp.html
<!DOCTYPE html>
{% load static %}
<html>
<head>
<link rel="stylesheet" href="{% static "css/signUp.css" %}" />
<title>Sign up</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">
<h1 class="title">Sign up</h1>
{% csrf_token %}
{% for field in form %}
{% if field.errors %}
<div class="alert alert-info" role="alert">
{{ field.errors }}
</div>
{% endif %}
{{ field }}
{% endfor %}
<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>
{% 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 %}
<button class="form-button" type="submit">Sign up</button>
</form>
</div>
</body>
</html>