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, когда я пытаюсь проверить пароль. не могли бы вы помочь, мне нужно сдать мой проект через неделю, и я испытываю трудности с функционалом входа.

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