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>

Ответы (0 шт):