Заменяющая модель auth_user не аутентифицирует должным образом (Django)

Всем привет, я начал работать над приложением Django для проекта класса, но я столкнулся с некоторой путаницей при попытке аутентификации пользовательских пользователей.

Приложение является платформой социальных сетей для моей школы, и в соответствии с требованиями проекта я должен прикрепить биографию и роль (должность в школе). Я решил, что лучший способ сделать это - прикрепить ее к существующей модели auth_user, но после изучения почти всего контента, который я смог найти, пользователи не проходят аутентификацию.

Даже при предоставлении правильной информации пользовательский объект по-прежнему None.

Для начала давайте посмотрим на мою модель пользователя, которая объявлена в приложении под названием "landingpage"

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    bio=models.TextField()
    role=models.CharField(max_length=32)

Затем мы переходим в главное приложение и объявляем, какой AUTH_USER_MODEL нам нужен

AUTH_USER_MODEL = "landingpage.User"

Окончательное применение команд миграции

python manage.py makemigrations
python manage.py migrate

Затем, чтобы протестировать его, у меня есть этот код. Моя система входа в систему представляет собой всплывающую форму, поэтому, чтобы избежать посещения страницы, я просто перенаправляю обратно на индекс, который также обновляет страницу, чтобы я мог обновлять содержимое, основываясь на аутентифицированном пользователе. Вероятно, есть лучший способ сделать это с помощью javascript, но я считаю, что пока это подходит.

def login(request):
    # If page is accessed via browser return because there is nothing here
    if request.method=='GET':
        return HttpResponseRedirect('/')
    username=request.POST['username']
    password=request.POST['password']
    user = authenticate(username=username, password=password)
    return HttpResponseRedirect('/')

Даже если введены правильные имя пользователя и пароль, объект пользователя будет None.

Я подозреваю, что это может быть связано с тем, что это моя 4-я миграция, но я не очень хорошо понимаю фреймворк django, потому что это всего лишь мой третий день.

Я прочитал документацию здесь https://docs.djangoproject.com/en/4.2/topics/auth/customizing/#extending-the-existing-user-model

Я также нашел похожий пост на stackoverflow, но он не решил проблему Не удается аутентифицировать пользовательскую модель пользователя в Django

Любая помощь будет очень признательна!

Необходимо проверить значения, переданные бэкенду в request.POST, поскольку процесс аутентификации чувствителен к регистру. Может быть, они строчные, а имя пользователя в БД прописное?

Когда вы проверили данные, но все еще не можете войти в систему, вы можете изменить пароль пользователя, используя python manage.py changepassword

После того как вы изменили пароль и authenticate вернули User экземпляр -. Ваш код почти работает

Дело в том, что authenticate просто проверяет, что пользователь ввел правильное имя пользователя+пароль, не более того.
Поэтому, чтобы действительно залогинить пользователя, нужно использовать функцию login вот так:

from django.contrib.auth import authenticate, login

def login(request):
    # If page is accessed via browser return because there is nothing here
    if request.method=='GET':
        return HttpResponseRedirect('/')
    username=request.POST['username']
    password=request.POST['password']
    user = authenticate(username=username, password=password)
    if user:
        login(request, user)
    return HttpResponseRedirect('/')

Проблема была вызвана порядком, в котором я создавал базы данных.

Для начала я изменил имя моего пользовательского пользователя с User на другое, но я все еще расширял абстрактный класс user.

поэтому я установил AUTH_USER_MODEL в корневом приложении, обратите внимание, что мой пользовательский пользователь не приходит из корневого приложения, и это важно

AUTH_USER_MODEL = "landingpage.HuskyBookUser"

Затем я удалил свою базу данных sqlite и папку migrations из приложения landingpage. Нет необходимости говорить, что не делайте этого в производстве, вам придется найти более элегантное решение.

Затем я выполнил следующие команды. Сначала я создал своего AbstractUser следующим образом

python manage.py makemigrations landingpage
python manage.py migrate landingpage

Затем я перенес остальные части приложения

python manage.py makemigrations
python manage.py migrate 

После этого я возвращаю объекты пользователей через функцию authenticate, которая не работала в моем предыдущем сообщении.

Я думаю, что корень моей проблемы в том, что я создал приложение с таблицей auth_users по умолчанию, и оно никогда не знало, что у меня есть другая таблица.

Вернуться на верх