18.form 对登录错误进行提示

上节说到views.py里login_form = LoginForm(request.POST)是一个LoginForm的实例,里面包含对users和password的要求。再把request.POST传进去进行检验以确定是否符合要求。login_form里面有个errors属性,如果不符合则里面会存储不符合的原因。login_form.is_valid()检查errors是否为空,如果为空则符合条件,is_valid()为True,然后再进行接下来的检验看密码和账号匹配否。
现在想实现对用户输入错误信息提示的功能,可以利用errors,如果不符合条件,则把errors里的错误原因显示在前端,且把输入错误的输入框用红框focus。这需要把后台变量传递到前端。

class LoginView(View):     #这样就不用做POST和GET的判断了,django根据情况自己调用
    def get(self,request):
        return render(request, "login.html", {})
    def post(self,request):
        login_form = LoginForm(request.POST)  #前端的html文件中变量名必须和forms里定义的两个名字相同才能自动检查
        if login_form.is_valid():   #is_valid检查login_form的error是否为空,为空则满足条件
            user_name = request.POST.get("username", "")
            pass_word = request.POST.get("password", "")
            user = authenticate(username=user_name, password=pass_word)
            if user is not None:
                login(request, user)
                return render(request,"index.html")
            else:
                return render(request, "login.html", {"msg": "用户名或密码错误"})
        else:
            return render(request, "login.html", {"login_form":login_form})

这样login_form和msg都传了。先检查符合条件不,如不符合则显示errors。如果符合再检查密码对不对,如不对则提示msg。login.html的表单里:

 <form action="/login/" method="post" autocomplete="off">
                    <input type='hidden' name='csrfmiddlewaretoken' value='mymQDzHWl2REXIfPMg2mJaLqDfaS1sD5' />
                    <div class="form-group marb20 {% if login_form.errors.username %}errorput{% endif %}">
                        <label>用&nbsp;户&nbsp;名</label>
                        <input name="username" id="account_l" type="text" placeholder="手机号/邮箱" />
                    </div>
                    <div class="form-group marb8  {% if login_form.errors.password %}errorput{% endif %}">
                        <label>密&nbsp;码</label>
                        <input name="password" id="password_l" type="password" placeholder="请输入您的密码" />
                    </div>
                    <div class="error btns login-form-tips" id="jsLoginTips">{% for key,error in login_form.errors.items %}{{ error }}{% endfor %}{{ msg }}</div>
                     <div class="auto-box marb38">

                        <a class="fr" href="forgetpwd.html">忘记密码?</a>
                     </div>
                     <input class="btn btn-green" id="jsLoginBtn" type="submit" value="立即登录 > " />
                     <input type='hidden' name='csrfmiddlewaretoken' value='5I2SlleZJOMUX9QbwYLUIAOshdrdpRcy' />
                     {% csrf_token %}
                </form>

两个label上面

<div class="form-group marb8  {% if login_form.errors.password %}errorput{% endif %}">

errorput是用来显示红框的。

 <div class="error btns login-form-tips" id="jsLoginTips">{% for key,error in login_form.errors.items %}{{ error }}{% endfor %}{{ msg }}</div>

这里的error btns login-form-tips大概是用来显示tips的。遍历errors(这是个字典的形式,所以要用items),把所有的value提取并显示出来,key就不显示了,外加msg。逻辑由后台处理,判断该显示errors还是msg。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容