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

首頁 > 編程 > Python > 正文

在Django的視圖中使用form對象的方法

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

這篇文章主要介紹了在Django的視圖中使用form對象的方法,Django是Python豐富多彩的開發框架中最具有人氣的一個,需要的朋友可以參考下

在學習了關于Form類的基本知識后,你會看到我們如何把它用到視圖中,取代contact()代碼中不整齊的部分。 一下示例說明了我們如何用forms框架重寫contact():

 

 
  1. # views.py 
  2.  
  3. from django.shortcuts import render_to_response 
  4. from mysite.contact.forms import ContactForm 
  5.  
  6. def contact(request): 
  7. if request.method == 'POST'
  8. form = ContactForm(request.POST) 
  9. if form.is_valid(): 
  10. cd = form.cleaned_data 
  11. send_mail( 
  12. cd['subject'], 
  13. cd['message'], 
  14. cd.get('email''noreply@example.com'), 
  15. ['siteowner@example.com'], 
  16. return HttpResponseRedirect('/contact/thanks/'
  17. else
  18. form = ContactForm() 
  19. return render_to_response('contact_form.html', {'form': form}) 
  20.  
  21.  
  22. # contact_form.html 
  23.  
  24. <html> 
  25. <head> 
  26. <title>Contact us</title> 
  27. </head> 
  28. <body> 
  29. <h1>Contact us</h1> 
  30.  
  31. {% if form.errors %} 
  32. <p style="color: red;"
  33. Please correct the error{{ form.errors|pluralize }} below. 
  34. </p> 
  35. {% endif %} 
  36.  
  37. <form action="" method="post"
  38. <table> 
  39. {{ form.as_table }} 
  40. </table> 
  41. <input type="submit" value="Submit"
  42. </form> 
  43. </body> 
  44. </html> 

看看,我們能移除這么多不整齊的代碼! Django的forms框架處理HTML顯示、數據校驗、數據清理和表單錯誤重現。

嘗試在本地運行。 裝載表單,先留空所有字段提交空表單;繼而填寫一個錯誤的郵箱地址再嘗試提交表單;最后再用正確數據提交表單。 (根據服務器的設置,當send_mail()被調用時,你將得到一個錯誤提示。而這是另一個問題。)

改變字段顯示

你可能首先注意到:當你在本地顯示這個表單的時,message字段被顯示成`` input type=”text”`` ,而它應該被顯示成<`` textarea`` >。我們可以通過設置* widget* 來修改它:

 

 
  1. from django import forms 
  2.  
  3. class ContactForm(forms.Form): 
  4. subject = forms.CharField() 
  5. email = forms.EmailField(required=False) 
  6. message = forms.CharField(**widget=forms.Textarea** ) 

forms框架把每一個字段的顯示邏輯分離到一組部件(widget)中。 每一個字段類型都擁有一個默認的部件,我們也可以容易地替換掉默認的部件,或者提供一個自定義的部件。

考慮一下Field類表現* 校驗邏輯* ,而部件表現* 顯示邏輯* 。

設置最大長度

一個最經常使用的校驗要求是檢查字段長度。 另外,我們應該改進ContactForm,使subject限制在100個字符以內。 為此,僅需為CharField提供max_length參數,像這樣:

 

 
  1. from django import forms 
  2.  
  3. class ContactForm(forms.Form): 
  4. subject = forms.CharField(**max_length=100** ) 
  5. email = forms.EmailField(required=False) 
  6. message = forms.CharField(widget=forms.Textarea) 

選項min_length參數同樣可用。

設置初始值

讓我們再改進一下這個表單:為字subject段添加* 初始值* : "I love your site!" (一點建議,但沒壞處。)為此,我們可以在創建Form實體時,使用initial參數:

 

 
  1. def contact(request): 
  2. if request.method == 'POST'
  3. form = ContactForm(request.POST) 
  4. if form.is_valid(): 
  5. cd = form.cleaned_data 
  6. send_mail( 
  7. cd['subject'], 
  8. cd['message'], 
  9. cd.get('email', `'noreply@example.com`_'), 
  10. [`'siteowner@example.com`_'], 
  11. return HttpResponseRedirect('/contact/thanks/'
  12. else
  13. form = ContactForm( 
  14. **initial={'subject''I love your site!'}** 
  15. return render_to_response('contact_form.html', {'form': form}) 

現在,subject字段將被那個句子填充。

請注意,傳入* 初始值* 數據和傳入數據以* 綁定* 表單是有區別的。 最大的區別是,如果僅傳入* 初始值* 數據,表單是unbound的,那意味著它沒有錯誤消息。

自定義校驗規則

假設我們已經發布了反饋頁面了,email已經開始源源不斷地涌入了。 這里有一個問題: 一些提交的消息只有一兩個字,我們無法得知詳細的信息。 所以我們決定增加一條新的校驗: 來點專業精神,最起碼寫四個字,拜托。

我們有很多的方法把我們的自定義校驗掛在Django的form上。 如果我們的規則會被一次又一次的使用,我們可以創建一個自定義的字段類型。 大多數的自定義校驗都是一次性的,可以直接綁定到form類.

我們希望`` message`` 字段有一個額外的校驗,我們增加一個`` clean_message()`` 方法到`` Form`` 類:

 

 
  1. from django import forms 
  2.  
  3. class ContactForm(forms.Form): 
  4. subject = forms.CharField(max_length=100) 
  5. email = forms.EmailField(required=False) 
  6. message = forms.CharField(widget=forms.Textarea) 
  7.  
  8. def clean_message(self): 
  9. message = self.cleaned_data['message'
  10. num_words = len(message.split()) 
  11. if num_words < 4: 
  12. raise forms.ValidationError("Not enough words!"
  13. return message 

Django的form系統自動尋找匹配的函數方法,該方法名稱以clean_開頭,并以字段名稱結束。 如果有這樣的方法,它將在校驗時被調用。

特別地,clean_message()方法將在指定字段的默認校驗邏輯執行* 之后* 被調用。(本例中,在必填CharField這個校驗邏輯之后。)因為字段數據已經被部分處理,所以它被從self.cleaned_data中提取出來了。同樣,我們不必擔心數據是否為空,因為它已經被校驗過了。

我們簡單地使用了len()和split()的組合來計算單詞的數量。 如果用戶輸入字數不足,我們拋出一個forms.ValidationError型異常。這個異常的描述會被作為錯誤列表中的一項顯示給用戶。

在函數的末尾顯式地返回字段的值非常重要。 我們可以在我們自定義的校驗方法中修改它的值(或者把它轉換成另一種Python類型)。 如果我們忘記了這一步,None值就會返回,原始的數據就丟失掉了。

指定標簽

HTML表單中自動生成的標簽默認是按照規則生成的:用空格代替下劃線,首字母大寫。如email的標簽是"Email" 。(好像在哪聽到過? 是的,同樣的邏輯被用于模塊(model)中字段的verbose_name值。 我們在第五章談到過。)

像在模塊中做過的那樣,我們同樣可以自定義字段的標簽。 僅需使用label,像這樣:

 

 
  1. class ContactForm(forms.Form): 
  2. subject = forms.CharField(max_length=100) 
  3. email = forms.EmailField(required=False, **label='Your e-mail address'** ) 
  4. message = forms.CharField(widget=forms.Textarea) 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产影院| 国产精品日韩在线播放| 98视频在线噜噜噜国产| 欧美wwwxxxx| 日韩精品视频免费专区在线播放| 久久亚洲综合国产精品99麻豆精品福利| 国产精品美女久久久久av超清| 国产一区二区免费| 国产成人在线亚洲欧美| 国产亚洲精品久久久久久牛牛| 久久人人爽人人| 欧美性生交大片免网| 亚洲天天在线日亚洲洲精| 亚洲天堂久久av| 久久精品国产成人| 免费不卡欧美自拍视频| 88国产精品欧美一区二区三区| 国产va免费精品高清在线观看| 色婷婷**av毛片一区| 国产日韩在线亚洲字幕中文| 国产欧美精品xxxx另类| 国产精品久久久久久久久久小说| 91精品国产91久久久久久最新| 亚洲一区美女视频在线观看免费| 欧美日韩国产影院| 欧美国产日韩在线| 亚洲第一福利在线观看| 中文字幕成人精品久久不卡| 91成人国产在线观看| 国产69精品久久久久9| 国产伦精品一区二区三区精品视频| 亚洲精品av在线| 亚洲欧洲国产伦综合| 亚洲国产精品一区二区三区| 欧美丰满老妇厨房牲生活| 91中文精品字幕在线视频| 亚洲成人黄色网址| 亚洲电影免费观看高清完整版| 亚洲精品一区二区三区婷婷月| 亚洲视频在线观看免费| 欧美精品电影免费在线观看| 狠狠色香婷婷久久亚洲精品| 丰满岳妇乱一区二区三区| 久久久久久com| 日本精品视频网站| 久久精品91久久香蕉加勒比| 国产成人avxxxxx在线看| 日韩成人网免费视频| 久久露脸国产精品| 国产女人精品视频| 日韩欧美在线第一页| 欧美麻豆久久久久久中文| 国产精品久久久久久婷婷天堂| 91在线网站视频| 亚洲在线观看视频| 国产欧美韩国高清| 亚洲男人的天堂在线播放| 成人激情在线播放| 亚洲欧美日韩爽爽影院| 超碰精品一区二区三区乱码| 亚洲图片欧美午夜| 国自产精品手机在线观看视频| 中文字幕欧美视频在线| 日韩成人激情在线| 久久这里有精品视频| 亚洲va欧美va在线观看| 亚洲综合精品伊人久久| 国产精品国产三级国产aⅴ浪潮| 疯狂做受xxxx欧美肥白少妇| 国产精品普通话| 92看片淫黄大片看国产片| 亚洲欧美成人在线| 亚洲情综合五月天| 日韩中文av在线| 亚洲乱亚洲乱妇无码| 国产欧美日韩专区发布| 欧美黑人巨大精品一区二区| 亚洲人成电影在线观看天堂色| 青青久久av北条麻妃海外网| 欧美激情亚洲一区| 日韩欧美在线网址| 欧美与欧洲交xxxx免费观看| 成人在线中文字幕| 97视频在线观看亚洲| 国产精品第一页在线| 欧美激情精品久久久久久蜜臀| 欧美日韩久久久久| 久久精品色欧美aⅴ一区二区| 亚洲网站视频福利| 成人黄色av播放免费| 欧美国产日韩中文字幕在线| 国产拍精品一二三| 国产精品第3页| 亚洲第一偷拍网| 中日韩美女免费视频网站在线观看| 色综合伊人色综合网站| 日韩av片电影专区| 欧美日韩国产精品一区二区不卡中文| 91大神在线播放精品| 日韩精品在线免费观看视频| 欧美激情精品久久久久久久变态| 欧美福利视频在线| 国内免费精品永久在线视频| 最近中文字幕2019免费| 欧美精品福利视频| 啪一啪鲁一鲁2019在线视频| 国产精品嫩草影院一区二区| 国产在线视频欧美| 亚洲欧美日韩天堂| 亚洲欧洲国产精品| 8x拔播拔播x8国产精品| 2019国产精品自在线拍国产不卡| 国产精品video| 欧美黑人一区二区三区| 成人免费直播live| 亚洲欧美激情精品一区二区| 成人激情视频小说免费下载| 国产精品白嫩美女在线观看| 久久久久久久爱| 欧美肥臀大乳一区二区免费视频| 国色天香2019中文字幕在线观看| 久久99国产精品自在自在app| 国产日韩欧美另类| 日韩精品在线看| 欧美黑人巨大精品一区二区| 91精品视频免费| 日韩精品在线电影| 色婷婷综合久久久久| 欧美做受高潮1| 日韩欧美主播在线| 亚洲欧美精品一区| 亚洲欧美日本伦理| 亚洲91精品在线观看| 精品久久久久久久大神国产| 亚洲二区在线播放视频| 久久九九免费视频| 在线视频亚洲欧美| 欧美国产日产韩国视频| 91在线中文字幕| 国产一区二区三区在线观看视频| 欧美日韩中文在线观看| 不卡av在线播放| 91豆花精品一区| 91亚洲精品在线| 国产精品久久久久久久久粉嫩av| 欧美猛少妇色xxxxx| 一区二区成人精品| 亚洲电影免费观看高清| 欧美最猛性xxxx| 亚洲最新中文字幕| 伊人久久精品视频| 欧美亚洲在线观看| 日韩在线国产精品| 国产日韩在线观看av| 中文字幕自拍vr一区二区三区| 亚洲大胆人体av| 亚洲欧洲一区二区三区在线观看| 亚洲人精选亚洲人成在线| 国产精品入口夜色视频大尺度| 亚洲自拍偷拍色图| 黑人狂躁日本妞一区二区三区| 久久视频在线播放| 国产精品久久久久久五月尺| 国产精品黄色av|