Проблемы с входом пользователей в систему

Я создал две пользовательские формы на основе UserCreationForm и AuthenticationForm. После регистрации пользователя я хочу сразу же его зарегистрировать, и мне это удалось. Но когда я просто хочу войти в систему, возникает ошибка {'invalid_login': 'Пожалуйста, введите правильные %(имя пользователя) и пароль. Обратите внимание, что оба поля могут быть чувствительны к регистру.', 'inactive': 'This account is inactive.'}, даже если все введенные данные верны.

models.py

class User(AbstractUser):
    profile_image = models.ImageField(upload_to='accounts/images', default='default/user.jpg', blank=True, null=True)
    address = models.CharField(max_length=130, null=True, blank=True)
    date_of_birth = models.DateField(null=True, blank=True)
    
    def __str__(self) -> str:
        return f"{self.username}, {self.email}"

forms.py

class LoginForm(AuthenticationForm):

    class Meta:
        model = User
        fields = ['username', 'password']
        
    labels = {
        'username': "Username",
        'password': 'Password'
    }

views.py

class LoginView(View):
    
    def get(self, request):
        form = LoginForm()
        return render(request, 'accounts/login.html', {'form': form})

    def post(self, request):
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            
            user = authenticate(username=username, password=password)
            if user is not None:
                login(request, user)
                print(f"User {username} login successfully.")
                return redirect('blog:index')
            
        print(f"Form errors: {form.error_messages}")
        return render(request, 'accounts/login.html', {'form': form})

Шаблон login.html

{% extends 'base.html' %}

{% block title %}
    Login user
{% endblock %}

{% block content %}
    <div>
        <form action="" method="post">
            {% csrf_token %}
            {{ form }}
            <br>
            <button type="submit">Log in</button>
        </form>
    </div>
{% endblock %}

Я думаю, что проблема заключается в атрибуте is_active вашего пользователя. Поскольку вы не используете супер удобную функцию create_user, предоставляемую django, ваш код не может установить <youruser>.is_active = True.

По умолчанию ModelBackend не позволяет этим пользователям войти в систему. Подробнее об этом можно прочитать здесь.

Попробуйте это:

class RegisterView(View):

    def post(self, request):
        form = RegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password2')
            user = create_user(
                username=username,
                password=password,
                yourfield1=yourdata1,
                yourfield2=yourdata2,
            )
            # user.save() not needed anymore

        # [...]

Конечно, вы также можете просто добавить в код строку вроде user.is_active = True, и она будет работать так же хорошо.

class LoginView(View):

def get(self, request):
    form = LoginForm()
    return render(request, 'accounts/login.html', {'form': form})

def post(self, request):
    form = LoginForm(request, request.POST) # added request here
    if form.is_valid():
        username = form.cleaned_data.get('username')
        password = form.cleaned_data.get('password')
        
        user = authenticate(request, username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return redirect('blog:index')
        
    return render(request, 'accounts/login.html', {'form': form})
Вернуться на верх