Проблема с LoginView в Django после настройки модели пользователя
Я столкнулся с проблемой после кастомизации встроенной в Django модели пользователя (AbstractUser). Я создал пользовательскую модель пользователя с именем TheUser, которая наследует от AbstractUser. После внесения этого изменения встроенный LoginView из django.contrib.auth.views, похоже, не может аутентифицировать пользователей, несмотря на то, что данные пользователя существуют в базе данных MySQL.
Вот упрощенный обзор структуры моего кода:
models.py:
from django.db import models
from django.contrib.auth.models import AbstractUser
from phonenumber_field.modelfields import PhoneNumberField
# Create your models here.
choices = (
('M', 'Men'),
('F', 'Female'),
('P', 'Personnalised'),
)
class TheUser(AbstractUser):
age = models.IntegerField(blank=True, null=True)
genre = models.CharField(max_length=10, choices=choices, default='M')
adress = models.OneToOneField('UserAdress', on_delete=models.CASCADE, null=True)
phone_number = PhoneNumberField(null=True)
class UserAdress(models.Model):
country = models.CharField(max_length=20)
city = models.CharField(max_length=20)
Я определил пользовательскую модель пользователя под названием TheUser, которая включает дополнительные поля, такие как возраст, жанр, номер_телефона, и отношения один-к-одному с UserAdress.
urls.py:
from django.urls import path, include
from django.contrib.auth import views as auth_views
from .forms import userForm
form = userForm()
app_name = 'user'
urlpatterns = [
path('login/', auth_views.LoginView.as_view(template_name='registration/login.html', context={'form': form}), name='login'),
path('', include('django.contrib.auth.urls')),
]
URL входа настроен на использование Django's LoginView с пользовательским шаблоном входа (login.html). Также определены другие URL для регистрации, выхода и профиля.
forms.py:
from django import forms
from .models import TheUser
from phonenumber_field.widgets import PhoneNumberPrefixWidget
class userForm(forms.ModelForm):
country = forms.CharField(max_length=50)
city = forms.CharField(max_length=50)
class Meta:
model = TheUser
fields = [
'username',
'first_name',
'last_name',
'email',
'age',
'genre',
'phone_number',
'password',
]
widgets = {
'phone_number': PhoneNumberPrefixWidget()
}
Я определил пользовательскую форму userForm для обработки регистрации пользователей. Кроме того, существует UserLoginForm, которая является подклассом userForm специально для входа в систему.
auth_backends.py:
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import BaseBackend
class UserBackend(BaseBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
User = get_user_model()
try:
user = User.objects.get(username=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def get_user(self, user_id):
User = get_user_model()
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
Я реализовал пользовательский бэкенд аутентификации (UserBackend) для аутентификации пользователей на основе пользовательской модели пользователя (TheUser).
login.html:
{% extends 'generic_base.html' %}
{% block content %}
<h1 id="login-title">Login Page</h1>
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
{% if next %}
{% if user.is_authenticated %}
<p>Your account doesn't have access to this page. To proceed,
please login with an account that has access.</p>
{% else %}
<p>Please login to see this page.</p>
{% endif %}
{% endif %}
<form id="login-form" method='post'>
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
<input type='submit' value='login'>
<input type='hidden' name='next' value='{{ next }}'>
</table>
</form>
{% endblock content %}
Это пользовательский шаблон входа, используемый LoginView. Он включает поля формы для имени пользователя и пароля.
Несмотря на внесение этих изменений, при попытке войти в систему с помощью LoginView не удается аутентифицировать пользователей, выдавая ошибки типа "Your username and password didn't match. Пожалуйста, попробуйте еще раз."
Я прошу помощи в устранении этой проблемы и понимании того, почему LoginView не может аутентифицировать пользователей после настройки модели User.
Любые соображения или предложения будут высоко оценены. Спасибо!