天天看點

Django-表單學習總結

今天将表單這一章看完了,感覺稀裡糊塗的,在此做個總結:

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