Django form 流程
1、創建類,繼承form.Form
2、頁面根據類的對象自動創建html標簽
3、提交,request.POST
封裝到類的對象里,obj=UserInfo(request.POST)
4、用戶輸入是否合法
obj.is_valid()
5、全部合法,獲取全部內容
obj.clean()
6、只有有不合法
obj.errors
首先關閉跨站請求
#'django.middleware.csrf.CsrfViewMiddleware',
有錯誤會阻止提交,並提示錯誤信息
成功提交,可以獲取到提交的值
Form定制化
定制錯誤信息
mail = forms.EmailField(error_messages={'required':u'郵箱不能為空'})
定制錯誤規則
mobile = forms.CharField(validators=[mobile_validate,],
error_messages={'required':u'手機不能為空'})
from django.shortcuts import render
from django import forms
import re
from django.core.exceptions import ValidationError
def mobile_validate(value):
mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
if not mobile_re.match(value):
raise ValidationError('手機號碼格式錯誤')
class UserInfo(forms.Form):
email = forms.EmailField(error_messages={'required':u'郵箱不能為空'})
host = forms.CharField(error_messages={'required':u'主機不能為空'})
port = forms.CharField(error_messages={'required':u'端口不能為空'})
mobile = forms.CharField(validators=[mobile_validate,], #定義錯誤規則函數
error_messages={'required':u'手機不能為空'},
widget=forms.TextInput(attrs={'class':'form-control', #定義class
'placeholder':u'請輸入手機號'}))
beizhu = forms.CharField(required=False, #備注允許為空
widget=forms.Textarea(attrs={'class':'form-control', #定義為多行輸入框
'placeholder':u'請輸入備注'}))
user_type_choice = (
(0,u'普通用戶'),
(1,u'高級用戶'),
)
user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,attrs={'class':'form-control'}))
保存用戶輸入內容
obj = AccountForm.LoginForm(request.POST)
Form表單驗證以及錯誤信息
錯誤信息格式:
普通格式:
from django.shortcuts import render,HttpResponse
from web.forms import account as AccountForm
def login(request):
obj = AccountForm.LoginForm(request.POST)
if request.method == 'POST':
if obj.is_valid():
all_data = obj.clean()
else:
#用於Form表單提交
error = obj.errors
#print error['username'][0]
#print error['password'][0]
return render(request, 'account/login.html',{'obj':obj,'error':error})
return render(request, 'account/login.html',{'obj':obj})
創建一個simple_tag,使其輸 error['username'][0]
{% load xx %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="/login/" method="post">
<p>{{ obj.username }}
{% error_msg error.username %}
</p>
<p>{{ obj.password }}
{% error_msg error.password %}
</p>
<input type="submit" value="提交">
</form>
JSON格式
def login(request):
obj = AccountForm.LoginForm(request.POST)
if request.method == 'POST':
if obj.is_valid():
all_data = obj.clean()
else:
#用於Ajax
error = obj.errors.as_json()
#print error
return HttpResponse(error)
return render(request, 'account/login.html',{'obj':obj,'error':error})
return render(request, 'account/login.html',{'obj':obj})
<body>
<form action="/login/" method="post">
<p>{{ obj.username }}
{% error_msg error.username %}
</p>
<p>{{ obj.password }}
{% error_msg error.password %}
</p>
<input type="submit" value="Ajax提交" onclick="SubmitAjax()">
</form>
<script src="{{ STATIC_URL }}js/jquery-2.1.4.min.js"></script>
<script>
function SubmitAjax(){
$.ajax({
url:'/login/',
type:'POST',
data:{'username':'','password':''},
success:function(arg){
console.log(arg)
}
})
}
</script>
</body>
Form生成select標簽


靜態select
動態select

當增加數據庫數據時
不會更新,除非關閉程序,重新載入才會更新


解決方法:利用面向對象類的靜態字段
from django import forms
import json
class ImportForm(forms.Form):
#靜態select
HOST_TYPE_LIST = (
(0,'物理機'),
(1,'虛擬機'),
)
host_type = forms.IntegerField(
widget=forms.Select(choices=HOST_TYPE_LIST)
)
hostname = forms.CharField()
#動態select
# admin_dic = ((1,'yangmv'),(1,"bob"),)
# w_obj = open('db_admin','w')
# w_obj.write(json.dumps(admin_dic))
# w_obj.close()
f_obj = open('db_admin','r')
data = f_obj.read()
data_tuple = json.loads(data)
admin = forms.IntegerField(
widget=forms.Select(choices=data_tuple)
)
def __init__(self,*args,**kwargs):
super(ImportForm,self).__init__(*args,**kwargs)
tmp = open('db_admin')
data = tmp.read()
data_tuple = json.loads(data)
self.fields['admin'].widget.choices = data_tuple
再次增加數據庫數據,直接刷新頁面即可讀取到新數據
優化后代碼
from django import forms
import json
class ImportForm(forms.Form):
admin = forms.IntegerField(widget=forms.Select())
def __init__(self,*args,**kwargs):
super(ImportForm,self).__init__(*args,**kwargs)
tmp = open('db_admin')
data = tmp.read()
data_tuple = json.loads(data)
self.fields['admin'].widget.choices = data_tuple
使用models獲取select數據
(models操作,后面一偏文章會詳細介紹)
class Select(models.Model):
username = models.CharField(max_length=16)
password = models.CharField(max_length=32)
<body>
<form action="/home/">
<p>{{ obj.admin }}</p>
</form>
</body>
def home(request):
obj = HomeForm.ImportForm()
return render(request, 'home/home.html',{'obj':obj})
models.Select.objects.all().values_list('id','username')
