
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')

