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()
после этого все должно работать.