У меня есть model user'ов и проблема раньше была такая: когда пользователь регистрировался, то данные сохранялись в админке джанго не в его стандартной модели Users (идет по умолчанию), а в моей созданной модели которую я отобразил через admin.py. По этому выполнить логин не получалось, так как вьюха отвечающая за логин брала данные
ИЗ МОДЕЛИ USERS (В DJANGO ПО УМОЛЧАНИЮ) когда сами данные зарегистрированных пользователей находились в моей модели, по этому залогиниться не получалось.
Как я решил часть проблемы: я сделал так, чтобы модель пользователей в django по умолчанию была моделью которую я сделал. И пользователи по-прежнему там отображались после регистрации, с этим все нормально. Но
ЛОГИН я также не могу выполнить по какой-то неведомой причине.
Не знаю, может можно как-то во вью логина (views.py) сделать так, чтобы
ОНА БРАЛА ДАННЫЕ именно из модели которую
Я СОЗДАЛ? Такое возможно в теории как-то сделать? Просто других вариантов у меня нету.
settings.py
AUTH_USER_MODEL = 'users.User'
models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.base_user import BaseUserManager
class UserManager(BaseUserManager):
"""
В коде, UserManager не используется напрямую, но он указан в классе User как objects.
Это означает, что UserManager используется для управления объектами класса User в Django.
Он тут не ипользуется на прямую, но отвечает за удаление, добовление объектов класса User
"""
# Указание что этот менджер должен быть использован в миграциях джанго
use_in_migrations = True
# Создание пользователя и вывод исключения в терминал
def create_user(self, email, password, **extra_fields):
if not email:
raise ValueError('У пользователя должен быть email')
email = self.normalize_email(email) # Нормализует данные, переводит в нижний регистор, удаляет пробелы и т.д
user = self.model(email=email, **extra_fields) # Ссылка на модель, передача email и других полей (extra_fields)
user.set_password(password) # Устонавливает пароль
user.save(using=self._db) # Сохроняет пользователя в бд
return user
# Создание супер пользователя
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, password, **extra_fields)
class User(AbstractBaseUser):
email = models.EmailField(unique=True, null=False, blank=False)
username = models.CharField(max_length=40, unique=True, null=False, blank=False)
first_name = models.CharField(max_length=60, null=False, blank=False)
last_name = models.CharField(max_length=60, null=False, blank=False)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
def has_perm(self, perm, obj=None):
return self.is_superuser
def has_module_perms(self, app_label):
return self.is_superuser
def __str__(self):
return self.username
class Meta:
verbose_name = 'Authorized user'
verbose_name_plural = 'Authorized users'
views.py
def login_user(request):
if request.method == 'POST':
form = UserLoginForm(request.POST)
if form.is_valid():
print("Form is valid")
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(username=username, password=password)
if user is not None and user.is_active:
print(f"User logged in: {username}")
login(request, user)
return HttpResponseRedirect(reverse('myblog:index'))
else:
return render(request, 'users/login.html', {'form': form})
else:
form = UserLoginForm()
return render(request, 'users/login.html', {'form': form})
login.html
{% extends 'users/base.html' %}
{% load static %}
<title>Login</title>
{% block content %}
{% include 'myblog/complex/_navbar.html' %}
<div class="container">
<form action="{% url 'users:login_user' %}" method="POST">
{% csrf_token %}
{% if form.errors %}
<ul>
{% for field in form %}
{% if field.errors %}
<li>{{ field.label }}: {{ field.errors|join:", " }}</li>
{% endif %}
{% endfor %}
</ul>
{% endif %}
<!-- Rest of your form -->
<div class="login">
<div class="login__title">Login for <br>this website</div>
<div class="login__subtitle">If you already have an account, simply log in by entering your details.</div>
<div class="login__fields">
<div class="login__fields__username">
{{ form.username }}
</div>
<div class="login__fields__password">
{{ form.password }}
</div>
</div>
<div class="login__buttons">
<button class="login__btn" type="submit">Login in account</button>
<p class="linktext">You don't have account? <a href="{% url 'users:register_user' %}" class="linktext">Register</a></p>
</div>
</div>
</form>
</div>
{% endblock content %}