ログイン/パスワードのフォームを作成します。
モデル:
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})
uRL:
(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%}が機能しないのですか?どうも!
フォームにはエラーが発生したという考えがないためです。
ここでフォームを作成すると、次のようになります。
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
メソッドをオーバーライドして、フォームが検証に合格した場合にユーザーの資格情報を確認できるようにします。ビューをより見やすくするために、フォームオブジェクト自体にloginメソッドを配置します。
次に、私たちの見解では、これを行います:
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 %}
リダイレクトするときに、ページのコンテキストを送信するかどうかはわかりません。したがって、/ login /ページにリダイレクトすると、Djangoは、読み込まれる新しいフォームです。