最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Django框架中編寫(xiě)Contact表單的教程

 更新時(shí)間:2015年07月17日 17:52:07   投稿:goldensun  
這篇文章主要介紹了在Django框架中編寫(xiě)Contact表單的教程,Django是Python特色各異的框架中最有人氣的一個(gè),需要的朋友可以參考下

雖然我們一直使用書(shū)籍搜索的示例表單,并將起改進(jìn)的很完美,但是這還是相當(dāng)?shù)暮?jiǎn)陋: 只包含一個(gè)字段,q。這簡(jiǎn)單的例子,我們不需要使用Django表單庫(kù)來(lái)處理。 但是復(fù)雜一點(diǎn)的表單就需要多方面的處理,我們現(xiàn)在來(lái)一下一個(gè)較為復(fù)雜的例子: 站點(diǎn)聯(lián)系表單。

這個(gè)表單包括用戶提交的反饋信息,一個(gè)可選的e-mail回信地址。 當(dāng)這個(gè)表單提交并且數(shù)據(jù)通過(guò)驗(yàn)證后,系統(tǒng)將自動(dòng)發(fā)送一封包含題用戶提交的信息的e-mail給站點(diǎn)工作人員。

我們從contact_form.html模板入手:

<html>
<head>
  <title>Contact us</title>
</head>
<body>
  <h1>Contact us</h1>

  {% if errors %}
    <ul>
      {% for error in errors %}
      <li>{{ error }}</li>
      {% endfor %}
    </ul>
  {% endif %}

  <form action="/contact/" method="post">
    <p>Subject: <input type="text" name="subject"></p>
    <p>Your e-mail (optional): <input type="text" name="email"></p>
    <p>Message: <textarea name="message" rows="10" cols="50"></textarea></p>
    <input type="submit" value="Submit">
  </form>
</body>
</html>

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

如果我們順著上一節(jié)編寫(xiě)search()視圖的思路,那么一個(gè)contact()視圖代碼應(yīng)該像這樣:

from django.core.mail import send_mail
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response

def contact(request):
  errors = []
  if request.method == 'POST':
    if not request.POST.get('subject', ''):
      errors.append('Enter a subject.')
    if not request.POST.get('message', ''):
      errors.append('Enter a message.')
    if request.POST.get('email') and '@' not in request.POST['email']:
      errors.append('Enter a valid e-mail address.')
    if not errors:
      send_mail(
        request.POST['subject'],
        request.POST['message'],
        request.POST.get('email', 'noreply@example.com'),
        ['siteowner@example.com'],
      )
      return HttpResponseRedirect('/contact/thanks/')
  return render_to_response('contact_form.html',
    {'errors': errors})

(如果按照書(shū)中的示例做下來(lái),這這里可能乎產(chǎn)生一個(gè)疑問(wèn):contact()視圖是否要放在books/views.py這個(gè)文件里。 但是contact()視圖與books應(yīng)用沒(méi)有任何關(guān)聯(lián),那么這個(gè)視圖應(yīng)該可以放在別的地方? 這毫無(wú)緊要,只要在URLconf里正確設(shè)置URL與視圖之間的映射,Django會(huì)正確處理的。 筆者個(gè)人喜歡創(chuàng)建一個(gè)contact的文件夾,與books文件夾同級(jí)。這個(gè)文件夾中包括空的__init__.py和views.py兩個(gè)文件。

現(xiàn)在來(lái)分析一下以上的代碼:

    確認(rèn)request.method的值是'POST'。用戶瀏覽表單時(shí)這個(gè)值并不存在,當(dāng)且僅當(dāng)表單被提交時(shí)這個(gè)值才出現(xiàn)。 (在后面的例子中,request.method將會(huì)設(shè)置為'GET',因?yàn)樵谄胀ǖ木W(wǎng)頁(yè)瀏覽中,瀏覽器都使用GET,而非POST)。判斷request.method的值很好地幫助我們將表單顯示與表單處理隔離開(kāi)來(lái)。

    我們使用request.POST代替request.GET來(lái)獲取提交過(guò)來(lái)的數(shù)據(jù)。 這是必須的,因?yàn)閏ontact_form.html里表單使用的是method=”post”。如果在視圖里通過(guò)POST獲取數(shù)據(jù),那么request.GET將為空。

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

    雖然email非必填項(xiàng),但如果有提交她的值則我們也需進(jìn)行驗(yàn)證。 我們的驗(yàn)證算法相當(dāng)?shù)谋∪酰瑑H驗(yàn)證值是否包含@字符。 在實(shí)際應(yīng)用中,需要更為健壯的驗(yàn)證機(jī)制(Django提供這些驗(yàn)證機(jī)制,稍候我們就會(huì)看到)。

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

    注意,若要使用send_mail()函數(shù)來(lái)發(fā)送郵件,那么服務(wù)器需要配置成能夠?qū)ν獍l(fā)送郵件,并且在Django中設(shè)置出站服務(wù)器地址。 參見(jiàn)規(guī)范:http://docs.djangoproject.com/en/dev/topics/email/

    當(dāng)郵件發(fā)送成功之后,我們使用HttpResponseRedirect對(duì)象將網(wǎng)頁(yè)重定向至一個(gè)包含成功信息的頁(yè)面。 包含成功信息的頁(yè)面這里留給讀者去編寫(xiě)(很簡(jiǎn)單 一個(gè)視圖/URL映射/一份模板即可),但是我們要解釋一下為何重定向至新的頁(yè)面,而不是在模板中直接調(diào)用render_to_response()來(lái)輸出。

    原因就是: 若用戶刷新一個(gè)包含POST表單的頁(yè)面,那么請(qǐng)求將會(huì)重新發(fā)送造成重復(fù)。 這通常會(huì)造成非期望的結(jié)果,比如說(shuō)重復(fù)的數(shù)據(jù)庫(kù)記錄;在我們的例子中,將導(dǎo)致發(fā)送兩封同樣的郵件。 如果用戶在POST表單之后被重定向至另外的頁(yè)面,就不會(huì)造成重復(fù)的請(qǐng)求了。

    我們應(yīng)每次都給成功的POST請(qǐng)求做重定向。 這就是web開(kāi)發(fā)的最佳實(shí)踐。

contact()視圖可以正常工作,但是她的驗(yàn)證功能有些復(fù)雜。 想象一下假如一個(gè)表單包含一打字段,我們真的將必須去編寫(xiě)每個(gè)域?qū)?yīng)的if判斷語(yǔ)句?

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

# views.py

def contact(request):
  errors = []
  if request.method == 'POST':
    if not request.POST.get('subject', ''):
      errors.append('Enter a subject.')
    if not request.POST.get('message', ''):
      errors.append('Enter a message.')
    if request.POST.get('email') and '@' not in request.POST['email']:
      errors.append('Enter a valid e-mail address.')
    if not errors:
      send_mail(
        request.POST['subject'],
        request.POST['message'],
        request.POST.get('email', `'noreply@example.com`_'),
        [`'siteowner@example.com`_'],
      )
      return HttpResponseRedirect('/contact/thanks/')
  return render_to_response('contact_form.html', {
    'errors': errors,
    **'subject': request.POST.get('subject', ''),**
    **'message': request.POST.get('message', ''),**
    **'email': request.POST.get('email', ''),**
  })

# contact_form.html

<html>
<head>
  <title>Contact us</title>
</head>
<body>
  <h1>Contact us</h1>

  {% if errors %}
    <ul>
      {% for error in errors %}
      <li>{{ error }}</li>
      {% endfor %}
    </ul>
  {% endif %}

  <form action="/contact/" method="post">
    <p>Subject: <input type="text" name="subject" **value="{{ subject }}"** ></p>
    <p>Your e-mail (optional): <input type="text" name="email" **value="{{ email }}"** ></p>
    <p>Message: <textarea name="message" rows="10" cols="50">**{{ message }}**</textarea></p>
    <input type="submit" value="Submit">
  </form>
</body>
</html>

這看起來(lái)雜亂,且寫(xiě)的時(shí)候容易出錯(cuò)。 希望你開(kāi)始明白使用高級(jí)庫(kù)的用意——負(fù)責(zé)處理表單及相關(guān)校驗(yàn)任務(wù)。

相關(guān)文章

  • Ubuntu下創(chuàng)建虛擬獨(dú)立的Python環(huán)境全過(guò)程

    Ubuntu下創(chuàng)建虛擬獨(dú)立的Python環(huán)境全過(guò)程

    virtualenv可以搭建虛擬且獨(dú)立的python環(huán)境,可以使每個(gè)項(xiàng)目環(huán)境與其他項(xiàng)目獨(dú)立開(kāi)來(lái),保持環(huán)境的干凈,解決包沖突問(wèn)題。本篇文章講述如何在Linux以及Ubuntu中創(chuàng)建Python虛擬環(huán)境,以及Virtualenvwrapper的安裝使用,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-02-02
  • 使用Python操作MySQL的一些基本方法

    使用Python操作MySQL的一些基本方法

    這篇文章主要介紹了使用Python操作MySQL的一些基本方法,Python+MySQL也是服務(wù)器端快速開(kāi)發(fā)的一種絕佳搭配方案,需要的朋友可以參考下
    2015-08-08
  • 如何用Python實(shí)現(xiàn)八數(shù)碼問(wèn)題

    如何用Python實(shí)現(xiàn)八數(shù)碼問(wèn)題

    這篇文章主要給大家介紹了關(guān)于如何用Python實(shí)現(xiàn)八數(shù)碼問(wèn)題的相關(guān)資料,八數(shù)碼問(wèn)題是一種經(jīng)典的搜索問(wèn)題,它的目標(biāo)是將一個(gè)亂序的八數(shù)碼序列變成一個(gè)有序的八數(shù)碼序列,通常使用 A* 算法來(lái)解決,需要的朋友可以參考下
    2023-10-10
  • python文件名和文件路徑操作實(shí)例

    python文件名和文件路徑操作實(shí)例

    下面小編就為大家?guī)?lái)一篇python文件名和文件路徑操作實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 如何利用Boost.Python實(shí)現(xiàn)Python C/C++混合編程詳解

    如何利用Boost.Python實(shí)現(xiàn)Python C/C++混合編程詳解

    這篇文章主要給大家介紹了關(guān)于如何利用Boost.Python實(shí)現(xiàn)Python C/C++混合編程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧
    2018-11-11
  • Python中實(shí)現(xiàn)定時(shí)任務(wù)詳解

    Python中實(shí)現(xiàn)定時(shí)任務(wù)詳解

    這篇文章主要介紹了Python中實(shí)現(xiàn)定時(shí)任務(wù)詳解的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • Python實(shí)現(xiàn)批量下載excel表中超鏈接圖片

    Python實(shí)現(xiàn)批量下載excel表中超鏈接圖片

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)批量下載excel表中超鏈接圖片,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2024-11-11
  • 如何解決Pycharm編輯內(nèi)容時(shí)有光標(biāo)的問(wèn)題

    如何解決Pycharm編輯內(nèi)容時(shí)有光標(biāo)的問(wèn)題

    文章介紹了如何在PyCharm中配置VimEmulator插件,包括檢查插件是否已安裝、下載插件以及安裝IdeaVim插件的步驟
    2025-02-02
  • Python面向?qū)ο箢惖睦^承實(shí)例詳解

    Python面向?qū)ο箢惖睦^承實(shí)例詳解

    這篇文章主要介紹了Python面向?qū)ο箢惖睦^承,結(jié)合實(shí)例形式詳細(xì)分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類的繼承原理、定義、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-06-06
  • Python標(biāo)準(zhǔn)庫(kù)之urllib和urllib3的使用及說(shuō)明

    Python標(biāo)準(zhǔn)庫(kù)之urllib和urllib3的使用及說(shuō)明

    這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)之urllib和urllib3使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評(píng)論

北辰区| 龙岩市| 宣威市| 社会| 曲麻莱县| 西盟| 若尔盖县| 美姑县| 安多县| 治县。| 五峰| 北流市| 马边| 古田县| 新乡县| 象州县| 区。| 翁牛特旗| 民权县| 武功县| 奈曼旗| 繁昌县| 天峻县| 广安市| 九龙坡区| 西林县| 缙云县| 太湖县| 化德县| 彰化市| 丹凤县| 襄城县| 平舆县| 拜泉县| 芒康县| 乌苏市| 淅川县| 三原县| 宿州市| 永顺县| 万荣县|