亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

在Django框架中編寫Contact表單的教程

2020-01-04 18:02:40
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了在Django框架中編寫Contact表單的教程,Django是Python特色各異的框架中最有人氣的一個,需要的朋友可以參考下

雖然我們一直使用書籍搜索的示例表單,并將起改進的很完美,但是這還是相當的簡陋: 只包含一個字段,q。這簡單的例子,我們不需要使用Django表單庫來處理。 但是復雜一點的表單就需要多方面的處理,我們現在來一下一個較為復雜的例子: 站點聯系表單。

這個表單包括用戶提交的反饋信息,一個可選的e-mail回信地址。 當這個表單提交并且數據通過驗證后,系統將自動發送一封包含題用戶提交的信息的e-mail給站點工作人員。

我們從contact_form.html模板入手:

 

 
  1. <html> 
  2. <head> 
  3. <title>Contact us</title> 
  4. </head> 
  5. <body> 
  6. <h1>Contact us</h1> 
  7.  
  8. {% if errors %} 
  9. <ul> 
  10. {% for error in errors %} 
  11. <li>{{ error }}</li> 
  12. {% endfor %} 
  13. </ul> 
  14. {% endif %} 
  15.  
  16. <form action="/contact/" method="post"
  17. <p>Subject: <input type="text" name="subject"></p> 
  18. <p>Your e-mail (optional): <input type="text" name="email"></p> 
  19. <p>Message: <textarea name="message" rows="10" cols="50"></textarea></p> 
  20. <input type="submit" value="Submit"
  21. </form> 
  22. </body> 
  23. </html> 

我們定義了三個字段: 主題,e-mail和反饋信息。 除了e-mail字段為可選,其他兩個字段都是必填項。 注意,這里我們使用method=”post”而非method=”get”,因為這個表單會有一個服務器端的操作:發送一封e-mail。 并且,我們復制了前一個模板search_form.html中錯誤信息顯示的代碼。

如果我們順著上一節編寫search()視圖的思路,那么一個contact()視圖代碼應該像這樣:

 

 
  1. from django.core.mail import send_mail 
  2. from django.http import HttpResponseRedirect 
  3. from django.shortcuts import render_to_response 
  4.  
  5. def contact(request): 
  6. errors = [] 
  7. if request.method == 'POST'
  8. if not request.POST.get('subject'''): 
  9. errors.append('Enter a subject.'
  10. if not request.POST.get('message'''): 
  11. errors.append('Enter a message.'
  12. if request.POST.get('email') and '@' not in request.POST['email']: 
  13. errors.append('Enter a valid e-mail address.'
  14. if not errors: 
  15. send_mail( 
  16. request.POST['subject'], 
  17. request.POST['message'], 
  18. request.POST.get('email''noreply@example.com'), 
  19. ['siteowner@example.com'], 
  20. return HttpResponseRedirect('/contact/thanks/'
  21. return render_to_response('contact_form.html'
  22. {'errors': errors}) 

(如果按照書中的示例做下來,這這里可能乎產生一個疑問:contact()視圖是否要放在books/views.py這個文件里。 但是contact()視圖與books應用沒有任何關聯,那么這個視圖應該可以放在別的地方? 這毫無緊要,只要在URLconf里正確設置URL與視圖之間的映射,Django會正確處理的。 筆者個人喜歡創建一個contact的文件夾,與books文件夾同級。這個文件夾中包括空的__init__.py和views.py兩個文件。

現在來分析一下以上的代碼:

確認request.method的值是'POST'。用戶瀏覽表單時這個值并不存在,當且僅當表單被提交時這個值才出現。 (在后面的例子中,request.method將會設置為'GET',因為在普通的網頁瀏覽中,瀏覽器都使用GET,而非POST)。判斷request.method的值很好地幫助我們將表單顯示與表單處理隔離開來。

我們使用request.POST代替request.GET來獲取提交過來的數據。 這是必須的,因為contact_form.html里表單使用的是method=”post”。如果在視圖里通過POST獲取數據,那么request.GET將為空。

這里,有兩個必填項,subject 和 message,所以需要對這兩個進行驗證。 注意,我們使用request.POST.get()方法,并提供一個空的字符串作為默認值;這個方法很好的解決了鍵丟失與空數據問題。

雖然email非必填項,但如果有提交她的值則我們也需進行驗證。 我們的驗證算法相當的薄弱,僅驗證值是否包含@字符。 在實際應用中,需要更為健壯的驗證機制(Django提供這些驗證機制,稍候我們就會看到)。

我們使用了django.core.mail.send_mail函數來發送e-mail。 這個函數有四個必選參數: 主題,正文,寄信人和收件人列表。 send_mail是Django的EmailMessage類的一個方便的包裝,EmailMessage類提供了更高級的方法,比如附件,多部分郵件,以及對于郵件頭部的完整控制。

注意,若要使用send_mail()函數來發送郵件,那么服務器需要配置成能夠對外發送郵件,并且在Django中設置出站服務器地址。 參見規范:http://docs.djangoproject.com/en/dev/topics/email/

當郵件發送成功之后,我們使用HttpResponseRedirect對象將網頁重定向至一個包含成功信息的頁面。 包含成功信息的頁面這里留給讀者去編寫(很簡單 一個視圖/URL映射/一份模板即可),但是我們要解釋一下為何重定向至新的頁面,而不是在模板中直接調用render_to_response()來輸出。

原因就是: 若用戶刷新一個包含POST表單的頁面,那么請求將會重新發送造成重復。 這通常會造成非期望的結果,比如說重復的數據庫記錄;在我們的例子中,將導致發送兩封同樣的郵件。 如果用戶在POST表單之后被重定向至另外的頁面,就不會造成重復的請求了。

我們應每次都給成功的POST請求做重定向。 這就是web開發的最佳實踐。

contact()視圖可以正常工作,但是她的驗證功能有些復雜。 想象一下假如一個表單包含一打字段,我們真的將必須去編寫每個域對應的if判斷語句?

另外一個問題是表單的重新顯示。若數據驗證失敗后,返回客戶端的表單中各字段最好是填有原來提交的數據,以便用戶查看哪里出現錯誤(用戶也不需再次填寫正確的字段值)。 我們可以手動地將原來的提交數據返回給模板,并且必須編輯HTML里的各字段來填充原來的值。

 

 
  1. # views.py 
  2.  
  3. def contact(request): 
  4. errors = [] 
  5. if request.method == 'POST'
  6. if not request.POST.get('subject'''): 
  7. errors.append('Enter a subject.'
  8. if not request.POST.get('message'''): 
  9. errors.append('Enter a message.'
  10. if request.POST.get('email') and '@' not in request.POST['email']: 
  11. errors.append('Enter a valid e-mail address.'
  12. if not errors: 
  13. send_mail( 
  14. request.POST['subject'], 
  15. request.POST['message'], 
  16. request.POST.get('email', `'noreply@example.com`_'), 
  17. [`'siteowner@example.com`_'], 
  18. return HttpResponseRedirect('/contact/thanks/'
  19. return render_to_response('contact_form.html', { 
  20. 'errors': errors, 
  21. **'subject': request.POST.get('subject'''),** 
  22. **'message': request.POST.get('message'''),** 
  23. **'email': request.POST.get('email'''),** 
  24. }) 
  25.  
  26. # contact_form.html 
  27.  
  28. <html> 
  29. <head> 
  30. <title>Contact us</title> 
  31. </head> 
  32. <body> 
  33. <h1>Contact us</h1> 
  34.  
  35. {% if errors %} 
  36. <ul> 
  37. {% for error in errors %} 
  38. <li>{{ error }}</li> 
  39. {% endfor %} 
  40. </ul> 
  41. {% endif %} 
  42.  
  43. <form action="/contact/" method="post"
  44. <p>Subject: <input type="text" name="subject" **value="{{ subject }}"** ></p> 
  45. <p>Your e-mail (optional): <input type="text" name="email" **value="{{ email }}"** ></p> 
  46. <p>Message: <textarea name="message" rows="10" cols="50">**{{ message }}**</textarea></p> 
  47. <input type="submit" value="Submit"
  48. </form> 
  49. </body> 
  50. </html> 

這看起來雜亂,且寫的時候容易出錯。 希望你開始明白使用高級庫的用意——負責處理表單及相關校驗任務。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品福利视频导航| 精品无码久久久久久国产| 97在线视频一区| 91久久在线观看| 国产精品无av码在线观看| 欧美天天综合色影久久精品| 欧美日韩高清区| 精品日韩美女的视频高清| 日韩中文字幕第一页| 亚洲一区二区三区乱码aⅴ| 久久精品国产一区二区电影| 国产精品偷伦一区二区| 欧美黑人极品猛少妇色xxxxx| 亚洲毛茸茸少妇高潮呻吟| 超碰91人人草人人干| 亚洲午夜av久久乱码| 美女精品视频一区| 国产精品亚洲综合天堂夜夜| 欧美日韩国产一区中文午夜| 欧美激情久久久久| 色综合色综合久久综合频道88| 亚洲国产精品va在线看黑人| 亚洲国产女人aaa毛片在线| 国产精品扒开腿做爽爽爽男男| 欧美性xxxx极品高清hd直播| 亚洲精品美女网站| 久久久国产视频91| 亚洲欧洲国产精品| 色综合久久精品亚洲国产| 91精品国产99久久久久久| 亚洲成色777777女色窝| 亚洲欧美第一页| 成人信息集中地欧美| 97在线视频国产| 亚洲成人av在线| 色无极影院亚洲| 日韩在线免费观看视频| 成人字幕网zmw| 亚洲午夜色婷婷在线| 午夜精品一区二区三区在线| 欧美日韩在线影院| 欧美一级bbbbb性bbbb喷潮片| 少妇久久久久久| 亚洲欧美日韩精品久久亚洲区| 亚洲iv一区二区三区| 8x海外华人永久免费日韩内陆视频| 精品久久久久久久久久久久久久| 久久久久久69| 久久免费精品视频| 国产精品久久av| 成人有码在线视频| 丝袜情趣国产精品| 在线播放日韩专区| 亚洲精品97久久| 亚洲精品免费一区二区三区| 国产精品自拍网| 中文字幕av一区二区| 亚洲欧美成人一区二区在线电影| 国产成人精品久久二区二区91| 欧美电影在线免费观看网站| 亚洲欧美在线免费观看| 日韩在线观看精品| 国产精品一区专区欧美日韩| 欧美成人黄色小视频| 国产精品99久久久久久www| 欧美日本在线视频中文字字幕| 69久久夜色精品国产69| 国产97在线播放| 国产在线精品成人一区二区三区| 成人av电影天堂| 一区二区三区 在线观看视| 久久久久成人网| 青草青草久热精品视频在线网站| 国产精品扒开腿做| 国产精品网站入口| 国产一区二区三区视频在线观看| 亚洲国语精品自产拍在线观看| 69久久夜色精品国产69| 国产精品偷伦一区二区| 日韩av片免费在线观看| 亚洲男人天堂久| 欧美午夜美女看片| 欧美在线日韩在线| 日韩欧美成人免费视频| 成人午夜激情免费视频| 久久好看免费视频| 久久久精品影院| 国产在线高清精品| 亚洲a在线播放| 成人免费观看a| 亚洲石原莉奈一区二区在线观看| 亚洲色图50p| 久久视频在线看| 国内精品久久久久影院优| 亚洲色图国产精品| 中文字幕亚洲图片| 国产精品久久久久免费a∨| 中文字幕av一区| 最近更新的2019中文字幕| 欧美性猛交视频| 精品国产乱码久久久久酒店| 92版电视剧仙鹤神针在线观看| 精品福利在线视频| 久久久久久久久久av| 2019国产精品自在线拍国产不卡| 欧美特级www| 国产69精品久久久久久| 精品欧美激情精品一区| 欧美午夜xxx| 国产热re99久久6国产精品| 日本精品久久久久久久| 中文字幕日韩av综合精品| 亚洲v日韩v综合v精品v| 亚洲国产古装精品网站| 欧美国产日韩一区| 色综合老司机第九色激情| 91天堂在线观看| 亚洲精品视频免费在线观看| 97国产精品人人爽人人做| 久久久久久久香蕉网| 中文字幕成人在线| 国产精品视频xxxx| 久久人人看视频| 在线成人一区二区| 欧美在线视频在线播放完整版免费观看| 久久精品久久久久久国产 免费| 国语自产在线不卡| 超碰91人人草人人干| 欧美视频免费在线观看| 欧美激情啊啊啊| www.午夜精品| 亚洲国产精品嫩草影院久久| 国产精品999| 亚洲视频在线看| 亚洲无线码在线一区观看| 亚洲色图欧美制服丝袜另类第一页| 91国产一区在线| 亚洲福利视频网| 国产精品日日摸夜夜添夜夜av| 精品国产户外野外| 777午夜精品福利在线观看| 欧美成在线观看| 中文字幕自拍vr一区二区三区| 欧美日韩国产丝袜另类| 国产97免费视| 欧美高清videos高潮hd| 日本精品视频在线播放| 久久久电影免费观看完整版| 亚洲第一网中文字幕| 欧美美女15p| 中文字幕亚洲专区| 日韩国产中文字幕| 日韩在线不卡视频| 97久久久免费福利网址| 在线精品国产欧美| 日韩电影中文字幕一区| 91精品在线一区| 日韩欧美一区二区三区久久| 蜜臀久久99精品久久久久久宅男| 国产精品美女在线| 精品毛片网大全| 亚洲欧洲在线视频| 高跟丝袜一区二区三区| 欧美极品少妇xxxxⅹ喷水|