Authenticate не работает в django с моей пользовательской моделью пользователя

У меня есть пользовательская модель пользователя и пользовательская страница входа, основанная на формах djamgo:

мой forms.py имеет вид :

from django import forms


class LoginForm(forms.Form):
    Username = forms.CharField(widget=forms.TextInput(attrs={
        'class': 'username-in',
        'placeholder': 'enter your username...'
    }))
    Password = forms.CharField(widget=forms.TextInput(attrs={
        'class': 'password-in',
        'placeholder': 'enter your password...',
        'type': 'password'
    }))

В моей пользовательской модели пользователя я добавляю несколько полей, таких как это :

from django.db import models
from django.contrib.auth.models import AbstractUser, User


class UserDetails(AbstractUser):
    SuperUser = models.BooleanField(default=False)
    BranchManager = models.BooleanField(default=False)
    FinanceManager = models.BooleanField(default=False)
    BranchName = models.ForeignKey('stock.Branch', null=True, blank=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.first_name + " " + self.last_name

в моем view.py для входа в систему :

from django.contrib.auth.hashers import make_password
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from users.forms import LoginForm


def LoginPage(request):
    forms = LoginForm()
    if request.method == 'POST':
        forms = LoginForm(request.POST)
        if forms.is_valid():
            username = request.POST['Username']
            password = request.POST['Password']
            x = authenticate(username=username, password=password)
            if x:
                login(request, x)
                return redirect('/stock')
    context = {'form': forms}
    return render(request, "users/login.html", context)


def UserRegister(request):
    return render(request, 'users/register.html')


def LogoutPage(request):
    logout(request)
    return redirect('login')

Для проверки данных, приходящих из формы, я использую функцию print(), чтобы увидеть, какие данные приходят из формы, имя пользователя и пароль - это то, что должно быть, но когда я печатаю print(x), это происходит из этой строки --> `

x = authenticate(username=имя пользователя, password=пароль)

` результат None и оператор if не работает и пользователь не может войти в систему. В stteing.py проекта я добавил эту строку:

AUTH_USER_MODEL = 'users.UserDetails'

почему django не аутентифицирует пользователя и возвращает None в authenticate()???

в вашей форме вы можете использовать forms.PasswordInput вместо TextInput. https://docs.djangoproject.com/en/4.0/ref/forms/widgets/#passwordinput

в вашей модели пользователя лучше использовать пользовательские разрешения (usermodel.branch_change, usermodel.finance_change и т.д.) вместо дополнительных булевых полей (BranchManager, FinanceManager и т.д.) https://docs.djangoproject.com/en/4.0/topics/auth/customizing/#custom-permissions

для входа в систему лучше использовать LoginView из django.contrib.auth https://docs.djangoproject.com/en/4.0/topics/auth/default/#django.contrib.auth.views.LoginView

Я не знаю, как вы устанавливаете авторизацию в setup.py, но это не ваш случай.

Я думаю, что вы неправильно работаете с паролями. Вы можете проверить, как вы сохраняете пароли в базе данных? Если вы сохраняете пользователя просто,

user(**user_form.clened_data).save()  # this is not works.

это не работает без make_password:

user(**(user_form.clened_data | {password=make_password(user_form.clened_data['password'])} )).save()

после этого все должно работать.

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