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

在Django的視圖中使用form對(duì)象的方法

 更新時(shí)間:2015年07月18日 10:28:31   投稿:goldensun  
這篇文章主要介紹了在Django的視圖中使用form對(duì)象的方法,Django是Python豐富多彩的開發(fā)框架中最具有人氣的一個(gè),需要的朋友可以參考下

在學(xué)習(xí)了關(guān)于Form類的基本知識(shí)后,你會(huì)看到我們?nèi)绾伟阉玫揭晥D中,取代contact()代碼中不整齊的部分。 一下示例說明了我們?nèi)绾斡胒orms框架重寫contact():

# views.py

from django.shortcuts import render_to_response
from mysite.contact.forms import ContactForm

def contact(request):
  if request.method == 'POST':
    form = ContactForm(request.POST)
    if form.is_valid():
      cd = form.cleaned_data
      send_mail(
        cd['subject'],
        cd['message'],
        cd.get('email', 'noreply@example.com'),
        ['siteowner@example.com'],
      )
      return HttpResponseRedirect('/contact/thanks/')
  else:
    form = ContactForm()
  return render_to_response('contact_form.html', {'form': form})

 
# contact_form.html

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

  {% if form.errors %}
    <p style="color: red;">
      Please correct the error{{ form.errors|pluralize }} below.
    </p>
  {% endif %}

  <form action="" method="post">
    <table>
      {{ form.as_table }}
    </table>
    <input type="submit" value="Submit">
  </form>
</body>
</html>

看看,我們能移除這么多不整齊的代碼! Django的forms框架處理HTML顯示、數(shù)據(jù)校驗(yàn)、數(shù)據(jù)清理和表單錯(cuò)誤重現(xiàn)。

嘗試在本地運(yùn)行。 裝載表單,先留空所有字段提交空表單;繼而填寫一個(gè)錯(cuò)誤的郵箱地址再嘗試提交表單;最后再用正確數(shù)據(jù)提交表單。 (根據(jù)服務(wù)器的設(shè)置,當(dāng)send_mail()被調(diào)用時(shí),你將得到一個(gè)錯(cuò)誤提示。而這是另一個(gè)問題。)
改變字段顯示

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

from django import forms

class ContactForm(forms.Form):
  subject = forms.CharField()
  email = forms.EmailField(required=False)
  message = forms.CharField(**widget=forms.Textarea** )

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

考慮一下Field類表現(xiàn)* 校驗(yàn)邏輯* ,而部件表現(xiàn)* 顯示邏輯* 。
設(shè)置最大長度

一個(gè)最經(jīng)常使用的校驗(yàn)要求是檢查字段長度。 另外,我們應(yīng)該改進(jìn)ContactForm,使subject限制在100個(gè)字符以內(nèi)。 為此,僅需為CharField提供max_length參數(shù),像這樣:

from django import forms

class ContactForm(forms.Form):
  subject = forms.CharField(**max_length=100** )
  email = forms.EmailField(required=False)
  message = forms.CharField(widget=forms.Textarea)

選項(xiàng)min_length參數(shù)同樣可用。
設(shè)置初始值

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

def contact(request):
  if request.method == 'POST':
    form = ContactForm(request.POST)
    if form.is_valid():
      cd = form.cleaned_data
      send_mail(
        cd['subject'],
        cd['message'],
        cd.get('email', `'noreply@example.com`_'),
        [`'siteowner@example.com`_'],
      )
      return HttpResponseRedirect('/contact/thanks/')
  else:
    form = ContactForm(
      **initial={'subject': 'I love your site!'}**
    )
  return render_to_response('contact_form.html', {'form': form})

現(xiàn)在,subject字段將被那個(gè)句子填充。

請注意,傳入* 初始值* 數(shù)據(jù)和傳入數(shù)據(jù)以* 綁定* 表單是有區(qū)別的。 最大的區(qū)別是,如果僅傳入* 初始值* 數(shù)據(jù),表單是unbound的,那意味著它沒有錯(cuò)誤消息。
自定義校驗(yàn)規(guī)則

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

我們有很多的方法把我們的自定義校驗(yàn)掛在Django的form上。 如果我們的規(guī)則會(huì)被一次又一次的使用,我們可以創(chuàng)建一個(gè)自定義的字段類型。 大多數(shù)的自定義校驗(yàn)都是一次性的,可以直接綁定到form類.

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

from django import forms

class ContactForm(forms.Form):
  subject = forms.CharField(max_length=100)
  email = forms.EmailField(required=False)
  message = forms.CharField(widget=forms.Textarea)

  def clean_message(self):
    message = self.cleaned_data['message']
    num_words = len(message.split())
    if num_words < 4:
      raise forms.ValidationError("Not enough words!")
    return message

Django的form系統(tǒng)自動(dòng)尋找匹配的函數(shù)方法,該方法名稱以clean_開頭,并以字段名稱結(jié)束。 如果有這樣的方法,它將在校驗(yàn)時(shí)被調(diào)用。

特別地,clean_message()方法將在指定字段的默認(rèn)校驗(yàn)邏輯執(zhí)行* 之后* 被調(diào)用。(本例中,在必填CharField這個(gè)校驗(yàn)邏輯之后。)因?yàn)樽侄螖?shù)據(jù)已經(jīng)被部分處理,所以它被從self.cleaned_data中提取出來了。同樣,我們不必?fù)?dān)心數(shù)據(jù)是否為空,因?yàn)樗呀?jīng)被校驗(yàn)過了。

我們簡單地使用了len()和split()的組合來計(jì)算單詞的數(shù)量。 如果用戶輸入字?jǐn)?shù)不足,我們拋出一個(gè)forms.ValidationError型異常。這個(gè)異常的描述會(huì)被作為錯(cuò)誤列表中的一項(xiàng)顯示給用戶。

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

HTML表單中自動(dòng)生成的標(biāo)簽?zāi)J(rèn)是按照規(guī)則生成的:用空格代替下劃線,首字母大寫。如email的標(biāo)簽是"Email" 。(好像在哪聽到過? 是的,同樣的邏輯被用于模塊(model)中字段的verbose_name值。 我們在第五章談到過。)

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

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


 

相關(guān)文章

  • 對(duì)Python正則匹配IP、Url、Mail的方法詳解

    對(duì)Python正則匹配IP、Url、Mail的方法詳解

    今天小編就為大家分享一篇對(duì)Python正則匹配IP、Url、Mail的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python如何給內(nèi)存和cpu使用量設(shè)置限制

    python如何給內(nèi)存和cpu使用量設(shè)置限制

    這篇文章主要介紹了python如何給內(nèi)存和cpu使用量設(shè)置限制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 一文帶你手撕Python之散列類型

    一文帶你手撕Python之散列類型

    這篇文章主要介紹了Python字典的定義、操作方法和集合的基本概念,字典以鍵值對(duì)形式存儲(chǔ)數(shù)據(jù),可通過鍵訪問值,操作包括增刪改查等,集合是無序不重復(fù)的數(shù)據(jù)結(jié)構(gòu),適用于去重和集合運(yùn)算,需要的朋友可以參考下
    2024-09-09
  • 理解python多線程(python多線程簡明教程)

    理解python多線程(python多線程簡明教程)

    這篇文章主要介紹了理解python多線程,一個(gè)快速理解python多線程的簡明教程,需要的朋友可以參考下
    2014-06-06
  • Python列表切片操作實(shí)例探究(提取復(fù)制反轉(zhuǎn))

    Python列表切片操作實(shí)例探究(提取復(fù)制反轉(zhuǎn))

    在Python中,列表切片是處理列表數(shù)據(jù)非常強(qiáng)大且靈活的方法,本文將全面探討Python中列表切片的多種用法,包括提取子列表、復(fù)制列表、反轉(zhuǎn)列表等操作,結(jié)合豐富的示例代碼進(jìn)行詳細(xì)講解
    2024-01-01
  • pandas DataFrame truediv的具體使用

    pandas DataFrame truediv的具體使用

    本文主要介紹了pandas DataFrame truediv的具體使用,該方法用于執(zhí)行逐元素的真除法操作,下面就來具體介紹一下,感興趣的可以了解一下
    2025-04-04
  • python 解決函數(shù)返回return的問題

    python 解決函數(shù)返回return的問題

    這篇文章主要介紹了python 解決函數(shù)返回return的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Python命令行中引導(dǎo)用戶指定選擇路徑

    Python命令行中引導(dǎo)用戶指定選擇路徑

    這篇文章主要為大家介紹了命令行中引導(dǎo)用戶指定選擇路徑,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Python 找到列表中滿足某些條件的元素方法

    Python 找到列表中滿足某些條件的元素方法

    今天小編就為大家分享一篇Python 找到列表中滿足某些條件的元素方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python數(shù)組遍歷的簡單實(shí)現(xiàn)方法小結(jié)

    Python數(shù)組遍歷的簡單實(shí)現(xiàn)方法小結(jié)

    這篇文章主要介紹了Python數(shù)組遍歷的簡單實(shí)現(xiàn)方法,結(jié)合實(shí)例總結(jié)分析了Python針對(duì)數(shù)組的元素,索引常用遍歷技巧,需要的朋友可以參考下
    2016-04-04

最新評(píng)論

钦州市| 平凉市| 迁安市| 内丘县| 宝兴县| 祁门县| 松桃| 万载县| 沽源县| 安化县| 武穴市| 津市市| 射洪县| 卢氏县| 高邑县| 无极县| 岚皋县| 珲春市| 延吉市| 南城县| 临洮县| 岳池县| 明水县| 鲁山县| 阳西县| 武邑县| 绥江县| 尼勒克县| 石林| 六盘水市| 张家川| 汉寿县| 津市市| 海阳市| 平安县| 郧西县| 竹溪县| 宜宾市| 叶城县| 石柱| 敖汉旗|