Django Form 詳解

構建1個表單:

一、新建1個 forms.py 模塊,並導入 django.forms 模塊html

二、在 forms.py 模塊中定義1個 form 類,和 moldes 類 類似python

三、在 views.py 導入forms.py模塊, 並實例化1個 form 表單對象,並返回這個實例對象數據庫

四、在templates文件夾中 定義好form.html 模版django

注意:json

  • 若是前臺html,沒有建立form 可經過此方法在html直接建立from
  • 若是前臺html,已有from表單 ,須要確保 from 字段名稱 和 Input name 名稱一致,才能使用Django 內置from 類驗證

#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>

FORM 外鍵 多對多字段

外鍵: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>

三、一旦你實例化1個forms 類,就綁定1個form表單

能夠用 is_bound 檢測

f = ContactForm({'subject': 'Hello', 'email': 'adrian@example.com', 'message': 'Nice site!'})
f.is_bound
》True #輸出

四、cleaned_data 

輸出request.POST提交信息, 返回1個字典 <class 'dict'>

提交後在數據庫中保存

models.xxx.object.create(**obj.cleaned_data)

f.cleaned_data
{message': uNice site!, email: uadrian@example.com, subject: uHello}

五、檢查每一個表中的字段 errors 信息  .errors後面無()

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

六、前臺展現request.POST 錯誤字段 (表單中提交的錯誤信息驗證)

#後臺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

相關文章
相關標籤/搜索