Django страница входа в систему перезагружается и обновляется после ввода имени пользователя и пароля. Диагноз говорит, что форма недействительна, но я не знаю как? - PullRequest
1 голос
/ 06 апреля 2020

Это Django проект. После ввода имени пользователя и пароля страница входа обновляется и перезагружается вместо того, чтобы перенести меня на домашнюю страницу. html. Когда я выполнил диагностику c в представлении с использованием print (form.is_valid ()), он предоставил мне базовый код HTML, который составляет встроенный Django {{form}}, в терминале , Однако я не могу понять, где именно лежит ошибка.

1. Вид входа в систему

def authentication(request):
  print(request.method)
  if request.method=='POST':
     form=LoginForm(request.POST)
     print(form.errors)
     print(form)
     print(form.is_valid())
     if form.is_valid():
        form.save()
        username=form.cleaned_data.get('username')
        password=form.cleaned_data.get('password')
        user=authenticate(username=username, password=password)
        login(request, user)
        return HttpResponse('Success')
     else:
        print('code failed')
  else:
    form=LoginForm()
  return render(request, 'TCloneTemplates/login.html', {'form':form})

2.Forms.py

class LoginForm(AuthenticationForm):

    username = forms.EmailField(widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': '', 'id': 'hello'}))
    password = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': '', 'id': 'hi',}))

    def is_valid(self):
        form = super(LoginForm, self).is_valid()
        for f, error in self.errors.items():
            if f != '__all__':
                self.fields[f].widget.attrs.update({'class': 'error', 'value': strip_tags(error)})
        return form

3.Вход. html

<body>
    <div class="pic">
      <form method="POST">
        {% block content %}
          {% csrf_token %}
          {{ form.non_field_errors }}
          {{form}}
          <button type="submit">Get Inside</button>
        {% endblock content %}
      </form>
    </div>  
  </body>

4. URL-адрес, по которому я туда попал

path('loginer/', views.authentication, name='loginer')
Диагностика c сообщения в терминале
POST

    <tr><th><label for="hello">Username:</label></th><td><input type="text" name="username" class="form-control" placeholder="" id="hello" maxlength="150" required></td></tr>
    <tr><th><label for="hi">Password:</label></th><td><input type="password" name="password" class="form-control" placeholder="" id="hi" required></td></tr>

False

code failed

1 Ответ

0 голосов
/ 07 апреля 2020

Поскольку ваша форма явно недействительна (form.is_valid() означает False), но не содержит ошибок, это означает, что ваша форма не связана . Вы можете проверить это, напечатав form.is_bound, и увидите, что он возвращает False.

Это означает, что вы не передали ему данные. Странно, потому что вы инициализируете его с LoginForm(request.POST).

Итак, первое, на что нужно обратить внимание - это документация или исходный код для django.contrib.auth.forms.AuthenticationForm, который вы можете прочитать здесь :

Принимает request в качестве первого позиционного аргумента, который сохраняется в экземпляре формы для использования подклассами.

Это означает, что первый позиционный аргумент интерпретируется как request, и вам необходимо передать опубликованные данные как data параметр:

form = LoginForm(request, data=request.POST)

Теперь это должно связать форму.

Примечание : Это помогает сделать ваши диагностические сообщения c более четкими, так что вы также можете обнаружить пустые строки: print(f"errors: {form.errors}") по крайней мере покажет строку "errors:", даже если ошибок нет. print(f"is valid: {form.is_valid()}") сообщит вам, что False исходит из этой проверки, а не что-то еще.

...