Аутентификация пользователя при входе в систему с помощью форм и 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 здесь

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