Django authenticate() всегда возвращает None при входе в систему
model.py
class CustomUserManager(BaseUserManager):
def create_user(self, email, name, password=None, role='user'):
if not email:
raise ValueError('Users must have an email address')
if not name:
raise ValueError('Users must have a name')
user = self.model(
email=self.normalize_email(email),
name=name,
role=role,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, name, password):
user = self.create_user(
email=self.normalize_email(email),
name=name,
password=password,
role='admin', # Set the role to 'admin' for superuser
)
user.is_admin = True
user.is_staff = True
user.save(using=self._db)
return user
class CustomUser(AbstractBaseUser):
email = models.EmailField(verbose_name='email address', max_length=255, unique=True)
name = models.CharField(max_length=255)
address = models.CharField(max_length=255)
country = models.CharField(max_length=255)
qualifications = models.TextField(blank=True)
skills = models.TextField(blank=True)
exprence = models.IntegerField(max_length=255)
exp_details = models.CharField(max_length=255)
role = models.CharField(max_length=50, default='user') # Add the 'role' field
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
objects = CustomUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name']
def __str__(self):
return self.email
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self, app_label):
return True
forms.py
class SignUpForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput)
confirm_password = forms.CharField(widget=forms.PasswordInput)
qualifications = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Enter qualifications as comma-separated values'}), required=False)
skills = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Enter skills as comma-separated values'}), required=False)
class Meta:
model = CustomUser
fields = ['email', 'name', 'address', 'country', 'qualifications', 'skills', 'exprence', 'exp_details', 'password', 'confirm_password']
def clean_confirm_password(self):
password = self.cleaned_data.get('password')
confirm_password = self.cleaned_data.get('confirm_password')
if password != confirm_password:
raise forms.ValidationError("Passwords do not match")
return confirm_password
def clean_experience(self):
experience = self.cleaned_data.get('qualifications')
return experience.split(',') if experience else []
def clean_skills(self):
skills = self.cleaned_data.get('skills')
return skills.split(',') if skills else []
def save(self, commit=True):
user = super(SignUpForm, self).save(commit=False)
user.set_password(self.cleaned_data["password"])
# Check if qualifications is a string before splitting
qualifications = self.cleaned_data["qualifications"]
if isinstance(qualifications, str):
user.qualifications = qualifications.split(",") # Convert experience to a list
else:
user.qualifications = qualifications # Use the existing list
# Check if skills is a string before splitting
skills = self.cleaned_data["skills"]
if isinstance(skills, str):
user.skills = skills.split(",") # Convert skills to a list
else:
user.skills = skills # Use the existing list # Convert skills to a list
if commit:
user.save()
return user
class EmailAuthenticationForm(AuthenticationForm):
username = forms.EmailField(label='Email')
class LoginForm(forms.Form):
email = forms.EmailField(label='Email')
password = forms.CharField(label='Password', widget=forms.PasswordInput)
views.py
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
form.save()
return redirect('login') # Redirect to login page after successful signup
else:
form = SignUpForm()
return render(request, 'signup.html', {'form': form})
from django.contrib.auth import login, authenticate
from django.shortcuts import render, redirect
from .forms import LoginForm
from django.contrib import messages
def custom_login(request):
error_message = None
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
email = form.cleaned_data['email']
password = form.cleaned_data['password']
print(f"Email: {email}, Password: {password}") # Debug statement
# Authenticate the user
user = authenticate(request, username=email, password=password)
print(f"Authenticated User: {user}") # Debug statement
if user is not None:
# Login the user
login(request, user)
messages.success(request, 'Login successful.')
# Redirect to the home page
return redirect('home')
else:
error_message = 'Invalid email or password.'
else:
error_message = 'Form is not valid.'
else:
form = LoginForm()
return render(request, 'login.html', {'form': form, 'error_message': error_message})
я создаю приложение django, но при входе в систему я получаю null при аутентификации. я добавляю свой код. пароль, записанный в db, такой же, как и пароль hassed, когда я пытаюсь проверить пароль. не могли бы вы помочь, мне нужно сдать мой проект через неделю, и я испытываю трудности с функционалом входа.