web-dev-qa-db-ja.com

Python / Django:無効なログインでエラーメッセージを表示する方法

Django(2.0)Webサイトのログインを実行しようとしているので、これまでのところ、既存のアカウントでログインが機能しています。組み込みのログイン機能を使用しています。

「無効なユーザー名またはパスワード」などの無効なアカウントを入力すると、エラーメッセージが表示されます。しかし、私はこれについてどうやって行くのか分かりません。

現在、無効なアカウントを入力すると、ログインページが更新されます。どんな助けでもありがたいです!

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})
4
SJ19

テンプレートで

   {% 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})
8
Exprator

テンプレート内に追加するだけです:

{% 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 %}
8
Mike Ru

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 %}

上記をすべてのフィールドの最後に配置する必要があります。

テンプレートには既に_{{ form.as_p }}_が含まれているため、Djangoはフォームエラーを表示します。

問題は AuthenticationForm が最初の引数としてrequestをとることです。その後、_request.POST_から手動でデータをフェッチする代わりに、form.is_valid()を使用して、ユーザー名とパスワードが有効であり、ユーザーがアクティブであることを確認できます。

_def login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, request.POST)
        if form.is_valid():
            auth_login(self.request, form.get_user())
            return redirect('index')
    else:
        form = AuthenticationForm(request)
    return render(request, 'todo/login.html', {'form': form})
_

別のオプションは、独自に記述する代わりに組み込みのLoginViewを使用することです。

_from Django.contrib.auth import views as auth_views

urlpatterns = [
    ...
    path('accounts/login/', auth_views.LoginView.as_view(template_name='todo/login.html')),
    ...
]
_

次に、設定で _LOGIN_REDIRECT_URL_ を設定します。

_LOGIN_REDIRECT_URL = 'index'
_
1
Alasdair