我让登录/密码的形式:
模型:
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})
网址:
(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>
我使用重定向到登录页面,然后登录信息或密码是错误的,但我想使错误消息在这种情况下。 为什么要建设{%如果form.errors%}不起作用? 谢谢!
因为形式完全不知道发生了错误。
当你构建的形式在这里:
form=LoginForm()
你构建它没有传递给它的任何信息。 它不知道该贴的用户只是做了什么,或者说,登录失败,或密码遗失,或任何错误了。
下面是我的登录表单,如下所示:
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 %}
当您重定向,我不知道你把你的页面的上下文。 所以,当你重定向到/登录/页,Django的tinks它装载的新形式。
文章来源: Django. Error message for login form