Заменяющая модель 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 по умолчанию, и оно никогда не знало, что у меня есть другая таблица.