姜戈。登录表单的错误消息
Posted
技术标签:
【中文标题】姜戈。登录表单的错误消息【英文标题】:Django. Error message for login form 【发布时间】:2013-02-11 15:17:33 【问题描述】:我制作登录/密码表单:
型号:
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>
我使用重定向到登录页面然后登录或密码错误,但我想在这种情况下发出错误消息。为什么构造 % if form.errors % 不起作用?谢谢!
【问题讨论】:
您的HttpResponseRedirect
中没有呈现任何表单。
使用表单触发form.errors
【参考方案1】:
因为表单不知道发生了错误。
当你在这里构造表单时:
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
方法,这样如果表单通过验证,我们就可以检查用户的凭据。我们还在表单对象本身上放置了一个登录方法,以使我们的视图更清晰。
接下来,在我们看来,我们想要这样做:
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,我们会检查表单是否有效。表单的“clean”方法将被调用,并为我们检查用户凭据。
如果凭据失败,我们会引发错误,我们需要在模板中显示该错误。
表单引发的错误(但未附加到字段)存储在 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 %
【讨论】:
【参考方案2】:当您重定向时,我不确定您是否发送了页面的上下文。因此,当您重定向到 /login/ 页面时,django 认为这是一个已加载的新表单。
【讨论】:
以上是关于姜戈。登录表单的错误消息的主要内容,如果未能解决你的问题,请参考以下文章