@yaseliwanoff

Как решить проблему с авторизацией в Django после смены модели?

У меня есть 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 %}
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы