Аутентификация пользователя при входе в систему с помощью форм и Django
Я пытаюсь настроить аутентификацию пользователя на странице входа в систему, используя формы и сравнивая их со значениями базы данных, и мой код работает, но потом я понял, что получаю успешный вход, если я ввожу любой пароль, если он есть в базе данных. Я хочу сделать так, чтобы искать почту и получать пароль только для этого пользователя, а не для всей базы данных. Моя база данных не будет содержать дубликатов писем, поэтому мне не нужно беспокоиться об этом. Я потратил слишком много времени, пытаясь понять, как получить пароль для того же пользователя, что и письмо.
мой login.views выглядит следующим образом
def login(request):
if request.method == "POST":
form = Studentlogin(request.POST)
if form.is_valid():
email = form.cleaned_data.get('email')
password = form.cleaned_data.get('password')
user = User.objects.create_user(email, password)
try:
studentemail = students.objects.get(email=email)
studentpass = students.objects.get(password=password)
return render (request, 'subscrap/main.html', {'student': studentemail })
except:
messages.success(request, 'Error, either Email or Password is not correct')
pass
else:
form = Studentlogin()
return render(request, 'subscrap/login.html', {'form': form})
Моя модель студента выглядит следующим образом:
class students(models.Model):
fname = models.CharField(max_length=50)
lname = models.CharField(max_length=50)
password = models.CharField(max_length = 50 , null = True)
passwordrepeat = models.CharField(max_length = 50, null = True)
email = models.EmailField(max_length=150)
class Meta:
db_table = "students"
Мой файл формы:
class StudentForm(forms.ModelForm):
class Meta:
model = students
fields = "__all__"
class Studentlogin(forms.Form):
email = forms.EmailField(max_length=150)
password = forms.CharField(max_length = 50, widget=forms.PasswordInput)
Вам нужно сделать только один запрос, чтобы получить студента с заданным email и паролем:
def login(request):
if request.method == "POST":
form = Studentlogin(request.POST)
if form.is_valid():
email = form.cleaned_data.get('email')
password = form.cleaned_data.get('password')
user = User.objects.create_user(email, password)
try:
student = students.objects.get(email=email, password=password)
return render (request, 'subscrap/main.html', {'student': student})
except:
messages.success(request, 'Error, either Email or Password is not correct')
else:
form = Studentlogin()
return render(request, 'subscrap/login.html', {'form': form})
Ваш набор запросов к модели студентов students.objects.get(email=email)
возвращает ОДИН ОБЪЕКТ студента, где его email равен email, полученному из формы. Более точным именем переменной было бы student
. Обратите внимание, что .get()
возвращает ошибку DoesNotExist
, если нет ни одной подходящей записи.
Из того, что у вас есть, вы можете сделать (не идеально)
try
student = students.objects.get(email=email)
if student.password == password:
return render (request, 'subscrap/main.html', {'student': email}) # (or student.email)
else:
raise Exception()
except:
messages.success(request, 'Error, either Email or Password is not correct')
Building on what RedWheelbarrow wrote. Их набор запросов ищет студента, основываясь на том, у кого были точные email
и password
. Однако набор запросов все равно возвращает одного студента, поэтому если вы хотите вернуть только email в вашем рендере, вам нужно сделать
try:
student = students.objects.get(email=email, password=password)
return render (request, 'subscrap/main.html', {'student': email}) # (or student.email)
except:
messages.success(request, 'Error, either Email or Password is not correct')
Подробнее о методе qeueryset get
здесь