Python版本3.5,django版本1.10
Django自带的Forms模块用于服务器端表单的输入校验,不需要自己再对每个输入格式进行校验。操作如下
1,用户编写自己的类MyForm继承forms,在类中定义字段即“message = forms.CharField()”语句,与数据库类似。Django会自动将该类的实例转化为HTML表单输入语句。
2,在views.py中将表单传来的值赋予自定义类实例,即“form1 = MyForm(request.POST)”,调用forms类自带is_valid()方法判断表单输入是否是自定义类中字段类型,即“form1.is_valid()”,通过cleaned_data属性获取通过检验的数据,即“form1.cleaned_data”。
3,将自定义类实例放在html模板中。
注意:
第1步中form子类中定义字段时,常用属性如下:
required属性表示该字段是否必填,
error_messages属性表示错误提示信息,
max_length属性表示最长输入,
widget属性表示控件类型,
label属性表示在html中的label
第2步中视图对输入的处理
is_valid()方法检查输入,
errors属性显示不正确的原因,
若正确cleaned_data属性获取干净数据,
第3步html模板对form实例的引用,若是直接{{form1}},不是特别美观,可以通过访问{{form.字段名}}进行单独的渲染。
示例如下:
1 新建项目
django-admin.py startproject website3
2 启动服务器,查看是否正常
manage.py runserver
3 进入工程website3一级文件夹下新建app
python manage.py startapp account
4 将新建立的app加入工程中
修改 website3/website3/settings.py的INSTALL_APPS,将app名称加入该元组中。
5 修改website3/urls.py文件
from django.conf.urls import url
from django.contrib import admin
from account import views as account_views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', account_views.login, name='login'),
url(r'^home/', account_views.home, name='home'),
]
6 在account文件夹下新建forms.py文件
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(required=True, max_length=20, min_length=6)
password = forms.CharField(required=True, max_length=20, min_length=6)
7 修改views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import LoginForm
# Create your views here.
def home(request):
return render(request, 'account/home.html')
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
a = form.cleaned_data['username']
b = form.cleaned_data['password']
# 查询数据库进行验证,并放入session进行登陆判断
return HttpResponseRedirect('/home')
else:
form = LoginForm()
return render(request, 'account/login.html', {'form':form})
或者
from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import LoginForm
# Create your views here.
def home(request):
s = request.session.get('username', default=None)
return render(request, 'account/home.html', {'username':s})
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
a = form.cleaned_data['username']
b = form.cleaned_data['password']
# 查询数据库进行验证,并放入session进行登陆判断
request.session['username'] = a # 保存用户名在session中
return HttpResponseRedirect('/home')
return render(request, 'account/login.html')
8 添加html
login.html
上文中view.py第二个版本对应下面这个html,若用第一个版本则在模板中用{{form.username}}/{{form.password}}代替<input>部分
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>登陆</title>
<style>
html{
width: 100%;
height: 100%;
overflow: hidden;
font-style: sans-serif;
}
body{
width: 100%;
height: 100%;
font-family: 'Open Sans',sans-serif;
margin: 0;
background-color: #4A374A;
}
#login{
position: absolute;
top: 50%;
left:50%;
margin: -150px 0 0 -150px;
width: 300px;
height: 300px;
}
#login h1{
color: #fff;
text-shadow:0 0 10px;
letter-spacing: 1px;
text-align: center;
}
h1{
font-size: 2em;
margin: 0.67em 0;
}
input{
width: 278px;
height: 18px;
margin-bottom: 10px;
outline: none;
padding: 10px;
font-size: 13px;
color: #fff;
text-shadow:1px 1px 1px;
border-top: 1px solid #312E3D;
border-left: 1px solid #312E3D;
border-right: 1px solid #312E3D;
border-bottom: 1px solid #56536A;
border-radius: 4px;
background-color: #2D2D3F;
}
.but{
width: 300px;
min-height: 40px;
display: block;
background-color: #4a77d4;
border: 1px solid #3762bc;
color: #fff;
padding: 9px 14px;
font-size: 15px;
line-height: normal;
border-radius: 5px;
margin: 0;
}
</style>
</head>
<body>
<div id="login">
<h1>系统登陆</h1>
<form method='post'>
{% csrf_token %}
<input type="text" required="required" placeholder="用户名" name="username"></input>
<input type="password" required="required" placeholder="密码" name="password"></input>
<input class="but" type="submit" value="登录">
</form>
</div>
</body>
</html>
效果图