Подтвердить что ты не робот

Джанго. Сообщение об ошибке для формы входа

Я делаю логин/пароль:

Модель:

class LoginForm(forms.Form):
username = forms.CharField(max_length=100)
password = forms.CharField(widget=forms.PasswordInput(render_value=False),max_length=100)

Вид:

def login_view(request):
    if request.method == 'POST':
        username = request.POST['email']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None and user.is_active:
            login(request, user)
            return HttpResponseRedirect("/n1.html")# Redirect to a success page.
        return HttpResponseRedirect("/login")
    form=LoginForm()
    return render(request, 'enter.html', {'login_form': LoginForm})

URLs:

(r'^login/$', login_view),

шаблон:

{% if form.errors %}
<p>Something is wrong</p>
{% endif %}

<form class="form-signin" action="" method="post">
    <h2 class="form-signin-heading">Login</h2>
    {% csrf_token %}

    <input class="input-block-level" type="text" name="email" value="" id="email" placeholder="Email">

    <input class="input-block-level" type="password" name="password" value="" id="username" placeholder="Password">

    <button class="btn btn-large btn-primary" type="submit">Login</button>
    <input type="hidden" name="next" value="{{next|escape}}" />

</form>

Я использую перенаправление на страницу входа в систему, тогда логин или пароль неверны, но я хочу сделать сообщение об ошибке в этом случае. Почему конструкция {% if form.errors%} не работает? спасибо!

4b9b3361

Ответ 1

Поскольку форма не имеет никакой идеи, произошла ошибка.

Когда вы создаете форму здесь:

form=LoginForm()

Вы строите его, не передавая ему никакой информации. Он ничего не знает о POST, который только что сделал пользователь, или о том, что логин не удался, или что пароль отсутствует, или какая бы ошибка была.

Вот как выглядят мои формы входа:

class LoginForm(forms.Form):
    username = forms.CharField(max_length=255, required=True)
    password = forms.CharField(widget=forms.PasswordInput, required=True)

    def clean(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        user = authenticate(username=username, password=password)
        if not user or not user.is_active:
            raise forms.ValidationError("Sorry, that login was invalid. Please try again.")
        return self.cleaned_data

    def login(self, request):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        user = authenticate(username=username, password=password)
        return user

Мы переопределяем метод формы clean, поэтому, если форма проходит проверку, мы можем проверить учетные данные пользователя. Мы также поместили метод регистрации на сам объект формы, чтобы сделать наш просмотр более чистым.

Далее, на наш взгляд, мы хотим сделать это:

def login_view(request):
    form = LoginForm(request.POST or None)
    if request.POST and form.is_valid():
        user = form.login(request)
        if user:
            login(request, user)
            return HttpResponseRedirect("/n1.html")# Redirect to a success page.
    return render(request, 'enter.html', {'login_form': form })

Мы создаем экземпляр формы и передаем запрос request.POST для проверки.

Если у нас есть POST, мы проверяем, действительна ли форма. Форма "чистый" метод вызывается и проверяет учетные данные пользователя для нас.

Если учетные данные терпят неудачу, мы вызываем ошибку, которую мы должны показать в нашем шаблоне.

Ошибки, вызванные формой (но не привязанные к полю), хранятся в non_field_errors, которые могут отображаться следующим образом:

{% if form.non_field_errors %}
    <ul class='form-errors'>
        {% for error in form.non_field_errors %}
            <li>{{ error }}</li>
        {% endfor %}
    </ul>
{% endif %}

Ответ 2

При перенаправлении я не уверен, что вы отправляете контекст своей страницы. Поэтому, когда вы перенаправляетесь на страницу /login/page, django записывает новую загружаемую форму.