Украшение @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')