上节说到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的表单里:
用 户 名
密 码
{% csrf_token %}
两个label上面
errorput是用来显示红框的。
这里的error btns login-form-tips大概是用来显示tips的。遍历errors(这是个字典的形式,所以要用items),把所有的value提取并显示出来,key就不显示了,外加msg。逻辑由后台处理,判断该显示errors还是msg。