Украшение @login_required не работает в Django (пользователь не аутентифицирован?)

Я новичок в Django и пытаюсь установить страницу входа в систему и пытаюсь использовать украшение @login_required. Однако, когда я пытаюсь войти в систему с действительными учетными данными, я перенаправляюсь на страницу 'login' (настроенную на перенаправление неаутентифицированных пользователей). Я не уверен, проблема в декоре @login_required или, возможно, функция login() не проверяет подлинность пользователя

Вот мой код для формы регистрации:

class RegisterForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())
    confirm_password = forms.CharField(widget=forms.PasswordInput())
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username', 'email', 'password']

код для функции входа в систему в views.py:

def login_user(request):
if request.method =="GET":
    return render(request, "main/login.html", {})
else:
    username = escape(request.POST['userfield'])
    password = escape(request.POST['passfield'])
    
    try:
        user = User.objects.get(username=username)
    except:
        user = None
    
    if user is None:

        try:
            user = User.objects.get(email=username)
        except:
            user = None

            if user is None:
                messages.info(request, "*Sorry, that username or email does not exist")
                return redirect('login')
    
    pword = user.password

    if check_password(password, pword):
        login(request, user)
        return redirect('homepage')
        
    else:
        messages.info(request, '*Sorry, that was an incorrect password')
        return redirect('login')

my model for User in models.py:

class User(models.Model):
   first_name = models.CharField(max_length=100)
   last_name = models.CharField(max_length=100)
   username = models.CharField(max_length=100)
   email = models.EmailField(unique=True)
   password = models.CharField(max_length=100)
   admin = models.BooleanField(default=False)
   last_login = models.DateTimeField(null=True, blank=True)

и моя функция для достижения "домашней страницы" после входа в систему:

@login_required(redirect_field_name='login')
def homepage(request):
   return render(request, "main/homepage.html", {})

Заранее спасибо всем, кто может помочь :)

Необходимо правильно аутентифицировать пользователя перед входом в систему.

from django.contrib.auth import authenticate, login
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
    login(request, user)

Больше информации в документации

Когда вы создаете пользовательскую модель пользователя, вы всегда должны использовать AbstractBaseUser.

Note: Также не стоит называть одинаково свои модели, в django уже есть User модель в django.contrib.auth, поэтому измените ее имя.

Итак, вы не указали пользовательскую модель пользователя, поэтому вы не должны иметь возможность аутентификации, так как по умолчанию модель аутентификации User, которая находится в django.contrib.auth. Итак, с текущим кодом, когда вы делаете суперпользователя через python manage.py createsuperuser и затем аутентифицируетесь, это будет работать.

Вам следует использовать @login_required(login_url='login') вместо @login_required(redirect_field_name='login').

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