基于类视图和forms。
1、在users.py的app新创一个python文件,命名为forms.py
from django import forms
class UserForm(forms.Form):
username = forms.CharField(required=True)
password = forms.CharField(min_length=5, required=True, widget=forms.PasswordInput)
2、基于类视图写views.py
若请求是get,直接实例化UserForm,若请求是post,则把提交的数据实例化UserForm。
如果login_form.is_valid()为真,则数据存储在login_form.cleaned_data里。
from django.shortcuts import render, redirect
from django.urls import reverse
from django.contrib.auth import authenticate, login, logout
from django.views import View
from .forms import UserForm
# 基于forms
class LoginView(View):
def get(self, request, *args, **kwargs):
login_form = UserForm()
return render(request, "login.html", {"form": login_form})
def post(self, request, *args, **kwargs):
login_form = UserForm(request.POST)
if login_form.is_valid():
username = login_form.cleaned_data["username"]
password = login_form.cleaned_data["password"]
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect(reverse("index"))
else:
return render(request, "login.html", {"form": login_form, "message": "请输入正确的用户名或密码"})
else:
return render(request, "login.html", {"form": login_form, "errors": login_form.errors})
class LogoutView(View):
def get(self, request, *args, **kwargs):
logout(request)
return redirect(reverse("index"))
3、修改login.html显示错误信息,默认html语法写表单。
基于前面的login.html。这里只显示修改的部分。
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">登录</button>
{% csrf_token %}
</div>
</div>
{% if errors %}
<div class="form-group">
{% for key, error in errors.items %}
<label for="error" class="col-sm-2 control-label">{{ key }}:{{ error }}</label>
{% endfor %}
</div>
{% endif %}
{% if message %}
<div class="form-group">
<label for="error" class="col-sm-2 control-label">{{ message }}</label>
</div>
{% endif %}
4、(推荐)不采用html格式写表单。直接采用forms。
把原来的表单注释掉
<!--
<div class="form-group">
<label for="username" class="col-sm-2 control-label">用户名</label>
<div class="col-sm-2">
<input type="text" class="form-control" name="username" id="firstname" placeholder="请输入用户名">
</div>
</div>
<div class="form-group">
<label for="password" class="col-sm-2 control-label">密码</label>
<div class="col-sm-2">
<input type="password" class="form-control" name="password" id="lastname" placeholder="请输入密码">
</div>
</div>
-->
这里只为了实现功能,美化不作要求。
然后改成
{{ form.as_p }}