Python / Django: как отображать сообщения об ошибках при неверном входе в систему?

Я пытаюсь выполнить вход для моего веб-сайта Django (2.0), пока у меня есть вход в систему для существующих учетных записей. Я использую встроенную функцию входа в систему.

Теперь я хочу отображать сообщение об ошибке, когда вы вводите недопустимую учетную запись, например «Неверное имя пользователя или пароль!». Но я понятия не имею, как это сделать.

Прямо сейчас он просто обновляет страницу входа, когда вы вводите недействительную учетную запись. Любая помощь приветствуется!

Login.html

{% block title %}Login{% endblock %}

{% block content %}
  <h2>Login</h2>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Login</button>
  </form>
{% endblock %}

Просмотр входа

def login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request.POST)
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)

        if user is not None:
            if user.is_active:
                auth_login(request, user)
                return redirect('index')

    else:
        form = AuthenticationForm()
    return render(request, 'todo/login.html', {'form': form})

person SJ19    schedule 21.12.2017    source источник


Ответы (4)


в вашем шаблоне

   {% for message in messages %}

                    <div class="alert alert-success">
                        <a class="close" href="#" data-dismiss="alert">×</a>

                        {{ message }}

                    </div>
            {% endfor %}

с учетом

from django.contrib import messages

def login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request.POST)
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)

        if user is not None:
            if user.is_active:
                auth_login(request, user)
                return redirect('index')
        else:
            messages.error(request,'username or password not correct')
            return redirect('login')

    else:
        form = AuthenticationForm()
    return render(request, 'todo/login.html', {'form': form})
person Exprator    schedule 21.12.2017
comment
спасибо за совет. Какой удобный вклад. Я сделал пользовательскую аутентификацию oauth2 в качестве обучающего упражнения, и последнее, что мне нужно было сделать, - это передать сообщение об ошибке. Django 2.2 - person Tim Richardson; 30.12.2020

Вам нужно просто добавить в свой шаблон:

{% block title %}Login{% endblock %}

{% block content %}
<h2>Login</h2>

{% if form.errors %}
    <p>username or password not correct</p>
{% endif %}

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Login</button>
</form>
{% endblock %}
person Mike Ru    schedule 21.12.2017
comment
Это кажется самым простым решением, которое легко интегрируется с представлениями входа в систему по умолчанию, которые предоставляет Django. +1 - person MLavrentyev; 18.06.2018
comment
Как именно работает form.errors? Django повторно отображает форму с присутствием form.errors? - person timbram; 28.06.2018
comment
@MLavrentyev И однозначно согласен. - person timbram; 28.06.2018

Обновление для Django 2.0:

Для ошибок отдельных полей (например):

    <input type="text" class="form-control my-4" id="id_username" placeholder="Username" name="username">

    {% for error in form.username.errors %}
         <p class="text-danger">{{ error }}</p>
    {% endfor %}

Для ошибок, не связанных с полями (например, если пароль неверен):

     {% if form.non_field_errors %}
            {% for error in form.non_field_errors %}
                <p class="text-danger">{{ error }}</p>
            {% endfor %}
      {% endif %}

Вы должны поместить указанное выше в конце всех полей.

person Arindam Roychowdhury    schedule 09.01.2019
comment
Ваше объяснение неполевых ошибок потрясающее! Спасибо. - person Andrew Polukhin; 03.03.2021