今天将表單這一章看完了,感覺稀裡糊塗的,在此做個總結:
1.引入:from django import forms
2.自定義表單類:
<span style="font-size:18px;">#form.py
class ContactForm(forms.form):
subject=forms.CharField(max_length="20")
email = forms.EmailField(required=False)
#自定義校驗函數:
#以clean_開頭,以字端名稱結束
#此類方法将在預設校驗後自動執行
def clean_subject(self):
subject=self.cleaned_data['subject']
num_words=len(subject.split())
if num_words>20:
raise forms.ValidationError(' 敢不敢再長點?')
return subject #若不傳回,則使用者原來輸入的将丢失</span>
3.表單類的說明:
建立表單類對象:
1⃣️:f=ContactForm()
說明:建立不帶任何資料的純表單
2⃣️:f=ContactForm(request.GET或request.POST)
說明:建立帶有資料的表單。ps:僅當送出表單内容後,request.GET/POST才有 效,即request.method才有值
表單類的方法:
1⃣️ f.as_table()/as_ul()/as_p:傳回以表格/清單/段落,形式定義的表單的html,其中
<table>,<ul>,<form>的始末标記不再其中,這樣就可以自定義添加一些内容:
以table形式的輸出:
<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="me
以清單形式的輸出:
<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>
以段落形式的輸出:
<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>
2⃣️.f['subject']:顯示指定字段的html,如下
<input type="text" name="subject" id="id_subject" />
注意:在html中要使用f.subject而不是f['subject'],否則在運作時會出現錯誤提示這類沒有這個屬性。
3⃣️.f.errors:得到這個表單的所有輸入錯誤資訊的一個字典:
>>> f.errors
{'message': [u'This field is required.']}
4⃣️.f['subject'].errors:傳回該字段輸入的錯誤資訊的一個清單,若沒有錯誤資訊,則傳回空清單,在html中形式為f.subject.errors:
f['subject'].errors
[]
5⃣️f.is_vaild():
傳回布爾,判斷所輸入的資料是否全部合法
6⃣️ f.cleaned_data:
傳回一個包含字段名稱和相應的值的字典,該方法把它們轉換成相應的Python類型資料,比如字元串将被轉換為Unicode對象,整形将被轉化為python的整形
f.cleaned_data
{message': uNice site!, email: [email protected], subject: uHello}
4.定義相應的html檔案:
有了上面的基礎,我們就可以定義view.py和html 檔案了。
我的html檔案:
<!DOCTYPE html>
<html>
<head >
<meta charset="UTF-8">
<title>聯系人</title>
</head>
<body>
{% if form.errors %}
<p style="color:red">
Please correct the flow error{{ form.errors|pluralize }}
</p>
{% endif %}
<form action="" method="post">
<table >
<tr><td><lable for="id_subjec">subject</lable></td>
<td>{{ form.subject}}</td>
<td>{{ form.subject.errors }}</td>
</tr>
<tr><td><lable for="id_message">message</lable></td>
<td>{{ form.message}}</td>
<td>{{ form.message.errors }}</td>
</tr>
<tr><td><lable for="id_email">email</lable></td>
<td>{{ form.email}}</td>
<td>{{ form.email.errors }}</td>
</tr>
</table>
<input type="submit" value="submit">
</form>
</body>
</html>
5.我的視圖代碼:
def new_contact(request):
if request.method=='POST':
form=contact_form(request.POST)
if form.is_valid():
cd=form.cleaned_data
send_mail(cd['subject'],
cd['message'],
cd.get('email','[email protected]'),
['[email protected]'])
return HttpResponseRedirect('/conatct/thaks')
else:
return render_to_response('contact_form_new.html',{'form':form})
else:
form=contact_form(
initial={'subject':'i love you'}
)
return render_to_response('contact_form_new.html',{'form':form})