Python/Django:如何在无效登录时显示错误消息?
Posted
技术标签:
【中文标题】Python/Django:如何在无效登录时显示错误消息?【英文标题】:Python/Django: How to display error messages on invalid login? 【发布时间】:2018-06-04 01:42:43 【问题描述】:我正在尝试为我的 Django (2.0) 网站进行登录,到目前为止,我已经为现有帐户进行了登录。我正在使用内置的登录功能。
现在我想在您输入无效帐户时显示错误消息,例如“无效的用户名或密码!”。但我不知道该怎么做。
现在它只是在您输入无效帐户时刷新登录页面。任何帮助表示赞赏!
登录.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)
【问题讨论】:
【参考方案1】:您应该在模板中添加:
% 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 提供的默认登录视图轻松集成的最简单的解决方案。 +1 form.errors 究竟是如何工作的? Django 是否会在 form.errors 存在的情况下重新渲染表单? @MLavrentyev 绝对同意。【参考方案2】:在您的模板中
% 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)
【讨论】:
感谢您的提示。多么方便的贡献。我已经将自定义 oauth2 身份验证作为学习练习,并且传递回错误是我必须做的最后一件事。 Django 2.2【参考方案3】:为 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 %
您应该将上述内容放在所有字段的末尾。
【讨论】:
您对非字段错误的解释太棒了!谢谢。【参考方案4】:您的模板中已经有 form.as_p
,所以 Django 会显示任何表单错误。
问题在于AuthenticationForm
将request
作为其第一个参数。然后您可以使用form.is_valid()
来检查用户名和密码是否有效以及用户是否处于活动状态,而不是手动从request.POST
获取数据。
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'
【讨论】:
以上是关于Python/Django:如何在无效登录时显示错误消息?的主要内容,如果未能解决你的问题,请参考以下文章
python Django(极端情况):如何在FormView(CreateView / UpdateView)的form_valid方法中引发表单无效并添加错误消息
Python/Django:在runserver下登录到控制台,在Apache下登录到文件
如何在应用程序首先加载而不是Angular 5中的appComponent时显示登录组件
Google App Engine Python django TemplateSyntaxError:无效的块标签:'endif'