Python的Django框架中forms表單類的使用方法詳解2

用戶表單是Web端的一項基本功能,大而全的Django框架中自然帶有現成的基礎form對象,本文就Python的Django框架中forms表單類的使用方法詳解。

Form表單的功能

  • 自動生成HTML表單元素
  • 檢查表單數據的合法性
  • 如果驗證錯誤,重新顯示表單(數據不會重置)
  • 數據類型轉換(字符類型的數據轉換成相應的Python類型)

Form相關的對象包括

  • Widget:用來渲染成HTML元素的工具,如:forms.Textarea對應HTML中的<textarea>標簽
  • Field:Form對象中的一個字段,如:EmailField表示email字段,如果這個字段不是有效的email格式,就會產生錯誤。
  • Form:一系列Field對象的集合,負責驗證和顯示HTML元素
  • Form Media:用來渲染表單的CSS和JavaScript資源。

Form Objects

Form對象封裝了一系列Field和驗證規則,Form類都必須直接或間接繼承自django.forms.Form,定義Form有兩種方式:

方法一:直接繼承Form

from django import forms
class ContactForm(forms.Form):subject = forms.CharField(max_length=100,label='主題')message = form.CharField(widget=forms.TextArea)sender = form.EmailField()cc_myself = forms.BooleanField(required=False)

方法二:結合Model,繼承django.forms.ModelForm

#models.py
class Contact(models.Model):title = models.CharField(max_length=30)content = models.CharField(max_length=20)#form.py
class ConotactForm(ModelForm):class Meta:model = Contactfield = ('title','content') #只顯示model中指定的字段

在視圖(view)中使用form

在view函數中使用form的一般情景是:

view.py:

form django.shortcuts import render
form django.http import HttpResponseRedirectdef contact(request):if request.method=="POST":form = ContactForm(request.POST)if form.is_valid(): #所有驗證都通過#do something處理業務return HttpResponseRedirect('/')else:form = ContactForm()return render(request,'contact.html',{'form':form})

contact.html:

<form action='/contact/' method='POST'>{% for field in form %}<div class = 'fieldWrapper'>{{field.label_tag}}:{{field}}{{field.errors}}</div>{% endfor %}<div class='fieldWrapper'> <p><input type='submit' value='留言'></p></div>
</form>

處理表單數據

form.is_valid()返回true后,表單數據都被存儲在form.cleaned_data對象中(字典類型,意為經過清洗的數據),而且數據會被自動轉換為Python對象,如:在form中定義了DateTimeField,那么該字段將被轉換為datetime類型,還有諸如:IntegerField、FloatField

if form.is_valid():subject = form.cleaned_data['subject']message = form.cleaned_data['message']sender = form.cleaned_data['sender']cc_myself = form.cleaned_data['cc_myself']recipients = ['info@example.com']if cc_myself:recipients.append(sender)from django.core.mail import send_mailsend_mail(subject, message, sender, recipients)return HttpResponseRedirect('/thanks/') # Redirect after POST

Form的簡單使用方法就這些。 另:

在模版中顯示表單的幾種方式:

顯示form找template中的方法多種多樣,也可以自定義:

<form action="/contact/" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>

還可以使用form.as_table、form.as_ul,分別表示用<p>標簽,<table>標簽和<ul>表示顯示表單。如果要自定義,你只要獲取到每個元素的值就行:

<form action="/contact/" method="post">{{ form.non_field_errors }}<div class="fieldWrapper">{{ form.subject.errors }}<label for="id_subject">Email subject:</label>{{ form.subject }}</div><div class="fieldWrapper">{{ form.message.errors }}<label for="id_message">Your message:</label>{{ form.message }}</div><div class="fieldWrapper">{{ form.sender.errors }}<label for="id_sender">Your email address:</label>{{ form.sender }}</div><div class="fieldWrapper">{{ form.cc_myself.errors }}<label for="id_cc_myself">CC yourself?</label>{{ form.cc_myself }}</div><p><input type="submit" value="Send message" /></p>
</form>

每個form字段都可以使用 {{form.name_of_field}}得到。

也可以通過迭代form,每個迭代元素對應的是form里面的field

<form action="/contact/" method="post">{% for field in form %}<div class="fieldWrapper">{{ field.errors }}{{ field.label_tag }}: {{ field }}</div>{% endfor %}<p><input type="submit" value="Send message" /></p>
</form>

{{field}}有如下屬性:

{{field.lable}},如:Email address
{{field.label_tag}},如: <label for=id_email>Email address</label>
{{field.value}} 如:someone.@gmail.com
{{field.errors}}

實例:構建表單?
第一步:首先在models.py中定義一個表單模型

class RemarkForm(forms.Form):subject = forms.CharField(max_length=100 ,label='留言標題')mail = forms.EmailField(label='電子郵件')topic = forms.ChoiceField(choices=TOPIC_CHOICES,label='選擇評分') message = forms.CharField(label='留言內容',widget=forms.Textarea)cc_myself = forms.BooleanField(required=False ,label='訂閱該貼')

那個topic中的choices需要在models.py中定義一個數組.

TOPIC_CHOICES = (('leve1', '差評'),('leve2', '中評'),('leve3', '好評'),
)

這樣,之后在html顯示的表單就采用這個模型的數據了。

另外還有一種定義表單模型的方式,那就是直接繼承另一個models。如果我們在models里設計數據庫時,已經設計好了一個類(就是數據庫的表)之后想復用這個類的信息來作為表單的模型,那么很簡單,同樣是在models中的一個類

class Advertisement(models.Model): #訂單編號OrderID =  models.ForeignKey(OrderInfo)#//廣告標題#Title = models.CharField(max_length = 36) #//廣告內容#Content = models.CharField(max_length = 600)

注意,他的類型是models.Model,是做數據庫ORM用的。

然后怎么關聯呢?
需要導入一個新的類 (ModelForm)

from django.forms import ModelFormclass ContactForm(ModelForm):class Meta:model = Advertisementfields = ('Title', 'CustomerID')

這里的Advertisement就是之前那個ORM的模型。
第二步:OK,繼續我們的表單,下一步需要做什么呢?開始在views.py里寫對表單的調用吧.
def remark(request):

if request.method == 'POST': # 如果表單被提交form = ContactForm(request.POST) # 獲取Post表單數據if form.is_valid(): # 驗證表單return HttpResponseRedirect('/') # 跳轉
else:form = ContactForm() #獲得表單對象return render_to_response('message.html', {'form': form,
})

整個代碼很簡單,我就不過多的解釋了。


第三步:我們知道django里任何訪問都是通過urls.py來管理的。所以下面我們需要配置一個路徑。

(r'^message', 'iring.views.remark'),

第四步:最后應該是建立一個模板的時候了,因為我們最終是輸出到html上的.注意views的remark函數最后一行

return render_to_response('message.html', {'form': form,
})

就是講當前的表單對象輸出到message.html里,自動生成一個表單。
所以,先構建一個html.
這個html模板很簡單,除去不必要的CSS,我只給出核心部分好啦。

<form action="/message/" method="POST">
{% for field in form %}<div class="fieldWrapper">{{ field.label_tag }}:{{ field }} {{ field.errors }}div>
{% endfor %}
<div class="fieldWrapper"><p><input type="submit" value="留言" />p>div>
form>
{% for field in form %}{% endfor %}

用于對表單對象里的元素進行遍歷,然后通過

{{ field.label_tag }}
{{ field }} 
{{ field.errors }}

這三個標簽來輸出,注意{{ field.errors }}默認情況下是不會輸出的,只有當驗證表單正確性時才會輸出內容。

文章轉自:http://www.jb51.net/article/87046.htm

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457143.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457143.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457143.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

生動形象的理解API是如何工作的!

API(Application Programming Interface,應用程序編程接口) 簡單來說&#xff0c;就是其他人開發出來一塊程序&#xff0c;你想用&#xff0c;他會告訴你調用哪個函數&#xff0c;給這個函數傳什么參數&#xff0c;然后又會返回給你一個什么樣的結果&#xff0c;你不需要知道他…

ann matlab,人工神經網絡ann及其matlab仿真.ppt

人工神經網絡ann及其matlab仿真人工神經網絡 的研究方法及應用劉 長 安2004. 12. 31 引 言 利用機器模仿人類的智能是長期以來人們認識自然、改造自然和認識自身的理想。 研究ANN目的&#xff1a; (1)探索和模擬人的感覺、思維和行為的規律&#xff0c;設計具有人類智能的計算機…

字符串與樹的結合

https://leetcode.com/problems/scramble-string/?tabDescription 雖然題目不常見&#xff0c;但是里面關于字符串調轉和遞歸的思路&#xff0c;還是很有代表性的。 https://discuss.leetcode.com/topic/14337/share-my-4ms-c-recursive-solution/2 這個解法也把里面關于遞歸的…

ubuntu 安裝過程所需軟件

ubuntu 開發過程好用的軟件 Remarkable 一個用于書寫文檔的好工具&#xff0c;包括方便書寫數學公式。安裝過程 點擊上面“remarkable”下載.deb文件&#xff0c;然后雙擊會跳轉到ubuntun的軟件安裝中心&#xff0c;點擊install進行安裝。 sublime text3 配置 自定義快捷鍵Pref…

Day05-循環和列表字符串、元組和字典

一、字符串 字符串就是由若干個不同的unicode字符組成的不可變序列 1 .字符串創建 #單引號字符串 str1 天要下雨&#xff0c;娘要嫁人&#xff0c;由他去吧 str2 str() #空串 str3 str([10,20,30]) ? #雙引號字符串 str2 "天要下雨&#xff0c;娘要嫁人&#xff…

@查看MySQL版本的方法

1.在終端下:mysql -V. [rootlocalhost bin]# mysql -V; mysql Ver 14.14 Distrib 5.6.21, for Linux (x86_64) using EditLine wrapper [rootlocalhost bin]# mysql -v; ERROR 1045 (28000): Access denied for user rootlocalhost (using password: NO) 注意&#xff0c;這…

echarts 柱狀圖 ,顏色和顯示設置

最近在使用echart開發圖標&#xff0c;api里面雖然有些設置&#xff0c;但是如果想讓柱狀圖每個柱的顏色都不相同&#xff0c;簡單的通過color設置是沒有作用的&#xff0c;這里&#xff0c;就要用到其他的方式了 下面只是列舉下我認為比較常用的&#xff0c;其他的比較簡單&am…

Pycharm 專業版 導入系統pip安裝的包

Pycharm 專業版 導入系統pip安裝的包 在setting 中找到project interpeter ,點擊設置圖標&#xff0c;點擊Add&#xff0c;得到如圖所示選擇 System Interpreter即可,這樣 用pip安裝的包都加再進來了

nodejs express

2019獨角獸企業重金招聘Python工程師標準>>> 創建express服務器 //app.js文件 var express require(express); var app express(); //指定更目錄顯示的內容 app.get(/, function(req, res){ res.send(Hello World); }); //指定監聽端口 var server app.listen(…

JS常見知識點

1、寫一個按照下面方式調用都能正常工作的 sum 方法 console.log(sum(2,3)); // Outputs 5 console.log(sum(2)(3)); // Outputs 5 解決方案 function sum() {var fir arguments[0];if (arguments.length 2) {return arguments[0] arguments[1]} else {return function (sec…

格雷碼 matlab,基于格雷碼的結構光重建代碼(MATLAB版本)

【實例簡介】該代碼為brown university相關技術人員編寫&#xff0c;旨在用于學習研究3D結構光的原理、算法實現和應用。由于原有的網站( http://mesh.brown.edu/byo3d/index.html )近期無法訪問&#xff0c;為了便于3D愛好者可以方便學習相關內容&#xff0c;特將該網站部分代…

Day06-函數

函數 一、集合&#xff08;set) 特點:不允許有重復元素&#xff0c;如果添加重復元素&#xff0c;則會自動過濾&#xff0c;可以進行交集、并集的運算。 本質&#xff1a;無序且無重復元素的數據結構 1 創建集合 s1 set() #空集合 不能是{}&#xff0c;這是字典 s2 {1…

在TextView中實時顯示數據

//下面實時更新顯示在textView中的數據handler new Handler();runnable new Runnable(){Overridepublic void run(){// TODO Auto-generated method pushupTextView.setText(Integer.toString(Number.pushup_number)); handler.postDelayed(this, 1000); }}; handle…

DuangDuangDuang!碼云項目的 Readme.md 特殊技能

為什么80%的碼農都做不了架構師&#xff1f;>>> 我們在 碼云 上創建新項目的時候&#xff0c;常常會看到默認使用 README 文件初始化該項目&#xff08;如圖1 所示&#xff09;&#xff0c;然后在新建項目的根目錄下就會生成一個 README.md 文件&#xff08;如圖2 …

java sunjce,無法初始化類javax.crypto.SunJCE_b

我已經開發了一個Javaservlet應用程序&#xff0c;并且在我的開發PC上&#xff0c;一切正常&#xff0c;包括按計劃使用SFTP通過端口8443等上的HTTPS并以適當的SSL證書通過PDF復制PDF。但是&#xff0c;當我嘗試在實時服務器上運行該應用程序時&#xff0c;會收到錯誤消息。jav…

GitHub添加SSH keys報錯Key is invalid. It must begin with 'ssh-ed25519', 'ssh-rsa', 'ssh-dss', 'ecdsa-sha

GitHub添加SSH keys報錯Key is invalid. It must begin with ‘ssh-ed25519’, ‘ssh-rsa’, ‘ssh-dss’, ecdsa-sha 在GitHub上Add SSH key的時候報錯&#xff1a;Key is invalid. It must begin with ‘ssh-ed25519’, ‘ssh-rsa’, ‘ssh-dss’, ecdsa-sha。。。&#xff…

System.Diagnostics.Process 執行.EXE

分類&#xff1a; C#WINFORM 2009-04-05 21:09 459人閱讀 評論(0) 收藏 舉報 我們經常會遇到在Winform或是WPF中點擊鏈接或按鈕打開某個指定的網址, 或者是需要打開電腦中某個指定的硬盤分區及文件夾, 甚至是"控制面板"相關的東西, 那么如何做呢? 答案是使用Sys…

php 擴展 返回字符串,基于PHP7的PHP擴展開發之四(字符串的處理)

目的&#xff1a;熟悉字符串在PHP擴展里面如何處理要實現的PHP代碼如下&#xff1a;1、當字符串不包含指定前綴字符串時&#xff0c;把前綴字符串和被檢測字符合并返回。2、當字符串包含指定前綴字符串時&#xff0c;原樣返回。 我們將使用PHP擴展的方式實現str_concat功能。fu…

對象之int介紹

#Auther Bob #--*--conding:utf-8 --*-- #創建兩個int的對象&#xff0c;age1和age2age1 10 age2 int(1)#查看對象的類print(type(age1))# <class int>print(type(age2))# <class int> #bit_length表示一個十進制數最少需要占用多個二進制位print(age1.bit_lengt…

Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.

谷歌瀏覽器報錯 版本 73.0.3683.103&#xff08;正式版本&#xff09; &#xff08;32 位&#xff09;報錯內容如下Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.jquery.js:2 Cross-Origin Read Blocking (CORB) blocked cros…