自带表单类
之前登录的html里有表单
django里有自己的forms表单类,然后渲染到网页里
新建forms.py
其中密码输入框是有自己的widget形式
form跟model很像,官网有个对比图
from django import forms
class LoginForm(forms.Form):
sname = forms.CharField(max_length=30, label=u'姓名')
spwd = forms.CharField(label=u'密码',widget= forms.PasswordInput)
建path、view和html
在view里引用刚才的表单类,传递给html
html里只需写form框和提交按钮,
在里面加上该表单类,就可以加载表单类里面的用户名和密码等表单项
as_p的作用是将用户名和密码元素用p括起来
F12可以看到代码
path('index11/', views.Index11View.as_view()),
class Index11View(View):
def get(self, request):
loginForm = LoginForm()
return render(request, 'index10.html', {'loginForm': loginForm})
<form action="/stu/index11/" method="post">
{% csrf_token %}
{{ loginForm.as_p }}
<input type="submit">
</form>
提交后验证
获取post字典
当数据从表单中以post的方式提交后,继续写view,走post方法,接收到的request.POST,根据我们之前学过的它是键值对的字典,在控制台测试下:
from stu.forms import *
user = {'sname':'zhangsan','spwd':'123'}
loginForm = LoginForm(user)
print(loginForm)
<tr><th><label for="id_sname">姓名:</label></th><td><input type="text" name="sname" value="zhangsan" maxlength="30" required id="id_sname"></td></tr>
<tr><th><label for="id_spwd">密码:</label></th><td><input type="password" name="spwd" required id="id_spwd"></td></tr>
可以看到,传递给forms数据后,它会填充value值
校验
数据利用系统自带的admin用户表,它带很多自己的方法,用起来方便
- 校验数据是否合法:is_valid(),返回true和false
- 获取合法的数据:cleaned data
- 校验与admin用户名和密码是否匹配:authenticate
由于sname与admin的username字段不一致,不用拆包,可以赋值 - 将用户信息存放至session:自带ogin方法,需要引入
def post(self,request):
loginForm = LoginForm(request.POST)
if loginForm.is_valid():
data = loginForm.cleaned_data
user = authenticate(username=data['sname'],password=data['spwd'])
# User.objects.filter(username=)
if user:
login(request, user)
# request.session['user'] =
return HttpResponse('登录成功')
return HttpResponse('登录失败')
登录成功,会在登录页面看到有session
session过期时间2周
里面写的#是与自己数据库比较的方法,比较麻烦,之前学的保存session信息还需要序列化,还是django自带的比较简单