#python #django #django-views #django-forms
Вопрос:
views.py
def student_login(request):
form = StudentLoginForm()
if request.method == 'POST':
form = StudentLoginForm(data=request.POST)
print(form.is_valid())
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
print(username)
user = authenticate(username=username,password=password)
if user is not None:
login(request,user)
return redirect('index')
else:
messages.error(request,'Invalid username or password!')
else:
messages.error(request,'Invalid username or password!')
context = {'form':form}
return render(request,'student_login.html',context)
models.py
class Student(models.Model):
name = models.CharField(max_length=100)
username = models.CharField(max_length=100,unique=True,default=None)
mobile = models.CharField(max_length=8)
email = models.CharField(max_length=200,unique=True)
password = models.CharField(max_length=200,default=None,unique=True)
total_books_due = models.IntegerField(default=0)
def __str__(self):
return self.name
forms.py
class StudentLoginForm(forms.ModelForm):
class Meta:
model = Student
fields = ['username','password']
widgets = {
'password':forms.PasswordInput(),
}
student_login.html
{% extends 'base.html' %}
<!-- {% load crispy_forms_tags %} -->
{% block content %}
<div class="container">
<br>
<h2>Student Login Form</h2>
<br>
<form method="POST" action="">
{% csrf_token %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-danger" role="alert">
{{ message }}
</div>
{% endfor %}
{% endif %} <br>
{% for field in form %}
<p>{{ field.label }} </p>
<p>{{ field }} </p>
<br>
{% endfor %}
<br>
<input type="submit" class="btn btn-primary" value="Login">
</form>
</div>
{% endblock %}
Я пытался измениться снова и снова, но form.is_valid()
все равно возвращаюсь False
. Я не мог понять причину того, что форма недействительна, потому что я уже указал поля, которые я хочу показать, и добавил csrf_token
. Может ли кто-нибудь помочь мне понять, в чем проблема?
Комментарии:
1. Это показывает
<ul class="errorlist"><li>username<ul class="errorlist"><li>Student with this Username already exists.</li></ul></li><li>password<ul class="errorlist"><li>Student with this Password already exists.</li></ul></li></ul>
, но я хотел бы получить существующее имя пользователя и пароль, чтобы войти в систему существующего пользователя2. попробуйте войти в форму.ошибки
Ответ №1:
Старайтесь использовать только простую форму , а не a ModelForm
, так как ModelForm
s в фоновом режиме работают с созданием и обновлением объектов.
В этом случае ModelForm
выполняется проверка, как будто вы пытаетесь создать новый Student
, вызывающий already exists
сбои.
Например, вы можете написать простую форму входа в систему, подобную этой:
class StudentLoginForm(forms.Form):
username = forms.CharField(widget=forms.TextInput(attrs={'autofocus': True}))
password = forms.CharField(
label='Password',
strip=False,
widget=forms.PasswordInput,
)
А затем, в ваших представлениях, используйте его как есть:
def student_login(request):
form = StudentLoginForm()
if request.method == 'POST':
form = StudentLoginForm(data=request.POST)
if form.is_valid():
user = authenticate(
username=form.cleaned_data.get('username'),
password=form.cleaned_data.get('password'),
)
if user:
login(request, user)
return redirect('index')
messages.error(request, 'Invalid username or password!')
context = {'form':form}
return render(request,'student_login.html',context)
Ответ №2:
не могли бы вы, пожалуйста, изменить эту строку
form = StudentLoginForm(data=request.POST)
Для
form = StudentLoginForm(request.POST)
а также почему вы проверяете поля, как вы уже проверяли с помощью .is_valid()
функция?
Комментарии:
1. Я попытался изменить, но все равно получил ту же ошибку
Ответ №3:
Просто создайте простую форму с именем пользователя и паролем. Кроме того, поле пароля не должно быть уникальным, если вы используете обычный текст.
Лучше использовать встроенную пользовательскую модель, предоставленную django. Если вы хотите расширить поля в модели пользователя, используйте AbstractUser и переопределите модель пользователя. Смотрите в документации https://docs.djangoproject.com/en/3.2/topics/auth/customizing/