Проблема с 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.

Любые соображения или предложения будут высоко оценены. Спасибо!

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