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})
テンプレートで
{% 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})
テンプレート内に追加するだけです:
{% 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 %}
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'
_