激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 在Django框架中編寫Contact表單的教程

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

2020-07-24 11:27腳本之家 Python

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

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

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

我們從contact_form.html模板入手:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<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>

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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', '[email protected]'),
        ['[email protected]'],
      )
      return HttpResponseRedirect('/contact/thanks/')
  return render_to_response('contact_form.html',
    {'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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 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', `'[email protected]`_'),
        [`'[email protected]`_'],
      )
      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>

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产亚洲黑人性受xxxx精品 | 成人店女老板视频在线看 | 他也色在线视频 | 免费观看一级淫片 | 国产99精品在线 | 肉文女配h | 中文在线观看免费视频 | 欧美在线观看视频一区 | 操网 | 色的综合| 美女污污在线观看 | a一级黄色毛片 | 色淫影院 | 免费看操片 | 精品国产视频一区二区三区 | 免费激情网站 | 亚洲视频在线网 | 国产毛片在线 | 国产精品一二区 | av一二三四区 | 国产成人网 | 亚洲免费毛片基地 | 国产喷白浆10p| 日韩视频在线一区二区三区 | 91美女啪啪 | 美女羞羞视频在线观看 | 一级片免费在线播放 | 亚洲性一区 | 免费黄色欧美视频 | 久久久久久久久久美女 | 国产91丝袜在线播放 | 91精品国产一区二区三区四区在线 | 久国产精品视频 | 久久久一区二区三区四区 | 成人性生活视频在线播放 | 91精品国产777在线观看 | 精品国产一区在线 | 美女在线视频一区二区 | 中文字幕www | 欧美一级视频免费看 | 久久性生活免费视频 |