一、新建1個 forms.py 模塊,並導入 django.forms 模塊html
二、在 forms.py 模塊中定義1個 form 類,和 moldes 類 類似python
三、在 views.py 導入forms.py模塊, 並實例化1個 form 表單對象,並返回這個實例對象數據庫
四、在templates文件夾中 定義好form.html 模版django
注意:json
#forms.pyapp
from django import forms #導入Django.forms 模塊 from django.http import HttpRequest class Alongin(forms.Form): username=forms.CharField(max_length=30) email=forms.EmailField(required=True) #required 是否惟一 ip=forms.GenericIPAddressField()
#view.pyui
from django.shortcuts import render from app01.forms import Alongin #從forms.py模塊中 導入,Alongin類 def form(request): obj=Alongin() #實例化這個表單對象 return render(request,'form.html',{'data':obj}) #在form.html 中返回這個obj對象
#form.htmlspa
<body> <form action=' ' method='POST'> <div> {{data.username}}</div> <div> {{data.email}}</div> <div> {{data.ip}} </div> </form> </body>
外鍵:forms.ModelChoiceField(queryset=models.UserGroup.objects.all()).net
多對多:forms.ModelMultipleChoiceField(queryset=models.Organizations.objects.all())code
讓外鍵字段數據隨着model 更新而更新
def __init__(self, *args, **kwargs): super(UserInfoForm,self).__init__(*args, **kwargs) self.fields['user_type'].choices = models.UserType.objects.values_list('id','caption')
一、is_valid 驗證表單提交的內容是否合法
注意中間只有1個下劃線 ,根據是否合法,返回True 或 Faluse
#修改views.py
def form(request): obj=Alongin() #建立表單類 if request.method=='POST': CheckForm=Alongin(request.POST) #獲取實例對象中傳人的表單內容,通常是1個字典組成的對象 CheckResust=CheckForm.is_valid() #驗證表單 print(CheckForm,CheckResust ,sep="\n") #以換行的方式打印 return render(request,'form.html',{'data':obj}) #在html 中生成表單
二、實例化的from 類展示形式
from contact.forms import ContactForm f = ContactForm() print(f) #輸出 默認以html格式輸出 <tr><th><label for="id_subject">Subject:</label></th><td><input type="text" name="subject" id="id_subject" /></td></tr> <tr><th><label for="id_email">Email:</label></th><td><input type="text" name="email" id="id_email" /></td></tr> <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_mmessage /></td></tr>
as_ul(): 列表形式返回
as_p() : 段落形式返回
>>> print f.as_ul() <li><label for="id_subject">Subject:</label> <input type="text" name="subject" id="id_subject" /></li> <li><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></li> <li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li> >>> print f.as_p() <p><label for="id_subject">Subject:</label> <input type="text" name="subject" id="id_subject" /></p> <p><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></p> <p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p>
能夠用 is_bound 檢測
f = ContactForm({'subject': 'Hello', 'email': 'adrian@example.com', 'message': 'Nice site!'}) f.is_bound 》True #輸出
輸出request.POST提交信息, 返回1個字典 <class 'dict'>
提交後在數據庫中保存
models.xxx.object.create(**obj.cleaned_data)
f.cleaned_data {message': uNice site!, email: uadrian@example.com, subject: uHello}
def form(request): obj=Alongin() if request.method=='POST': CheckForm=Alongin(request.POST) print(CheckForm.errors) #輸出錯誤內容 print(type(CheckForm.errors)) #輸出錯誤類型 '''輸出內容 一、CheckForm.errors: <ul class="errorlist"> <li>ip <ul class="errorlist"> <li>Enter a valid IPv4 orIPv6 address.</li> </ul> </li> </ul> 二、type(CheckForm.errors): <class 'django.forms.utils.ErrorDict'> '''
注意:一、當CheckForm.errors 的錯誤信息爲多個時,程序默認以as_ul() 的方式輸出
二、經過type(CheckForm.errors) ,可發現它是1個django.forms.utils.ErrorDict 對象
三、能夠經過 ErrorDict 這個對象,在前臺模版人爲的返回錯誤信息
ErrorDict 在django 1.10 中有5個屬性,as_ul() ,as_json(),as_data(),as_text() ,__str__
特別說明: __str__ 默認返回 as_ul()
#後臺views.py 代碼
#能夠經過 ErrorDict 這個對象,在前臺模版人爲的返回錯誤信息 def form(request): obj=Alongin() #定義1個對象 status={} #由於考慮請求具體爲POST 和GET 因此定義1個全局變量,用於返回錯誤 if request.method=='POST': CheckForm=Alongin(request.POST) CheckResust=CheckForm.is_valid() print(CheckForm,CheckResust ,sep="\n") #輸出 request.POST 提交信息,是否有錯 print(CheckForm.as_p()) #輸出 request.POST 提交信息 以段落方式展現 ,注意as_p() 加括號 print(CheckForm.as_ul()) #輸出 request.POST 提交信息 以列表方式展現 ,注意as_ul() 加括號 print(CheckForm.cleaned_data) #輸出格式化後的 request.POST信息 print(CheckForm.errors) #輸出錯誤內容 print(type(CheckForm.errors)) #輸出錯誤類型 #定義這個錯誤對象 CheckForm.errors >> utils.ErrorDict if CheckResust: # 爲真 即 is_valid ==True return render(request,'form.html',{'data':obj}) else: status=CheckForm.errors return render(request,'form.html',{'data':obj,'status':status})
#前臺模版 form.html
<form method='POST'> <div>用戶名: {{data.username}}</div> <div>郵箱: {{data.email}}</div> <div>IP:{{data.ip}} </div> <input type='submit' value='提交'></input> <div style='color:red'> {{status.as_ul}} </div> #注意這裏的as_ul 爲屬性 不加() </form>
七、自定義錯誤信息
可在定義form 類的時候,添加自定義錯誤信息
error_messages :錯誤內容
required:必須的,不能爲空
invalid: 格式錯誤
max_length: 最大長度
min_length:最小長度
from django import forms class FM(forms.Form): username = forms.CharField( max_length=12, min_length=6, error_messages={'required':'用戶名不能爲空', 'max_length':'請輸入最小長度爲6位數的用戶名', 'max_length':'用戶名最大長度不能超過12位' } ) pwd = forms.CharField( max_length=12, min_length=6, error_messages={'required':'密碼不能爲空'} ) email =forms.EmailField( error_messages={'required':'郵箱不能爲空','invalid':'郵箱格式錯誤'} )
其餘錯誤內容,查看:https://my.oschina.net/esdn/blog/812417