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 会显示任何表单错误。

问题在于AuthenticationFormrequest 作为其第一个参数。然后您可以使用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'

仅在电子邮件无效时显示错误消息