Проверка формы, возвращающая значение False в Django

#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/