1. 程式人生 > >Django的魅力 ——優雅的表單操作

Django的魅力 ——優雅的表單操作

Django 中的表單

  表單,在前端頁面中屬於最常見的一個東西了。基本上網站資訊的提交都用到了表單,記得剛學習前端頁面時就照著網上的例子敲了一個登入的表單。話不多說,來看一看Django中優雅的表單系統:Form

Form 表單的功能
  • 自動生成HTML表單元素
  • 檢查表單資料的合法性
  • 回顯功能(驗證錯誤,輸入資料不會被清空)
  • 資料型別轉換(轉換成相應的pyhon型別)
表單小試

  通常提交資料就是由HTML表單向後臺傳遞資訊,後臺通過request.GET[] 或request.POST[]獲取。

而使用Django表單則是這樣的:
首先在APP模組中建立一個 forms.py 檔案

#forms.py
from django import forms

class LoginForm(forms.Form):
    account = forms.CharField()
    password = forms.CharField()
    email = forms.EmailField()

建立對應的檢視函式

#views.py
from django.shortcuts import render
from django.http import HttpResponse
from .forms import LoginForm

def login
(request):
if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): return HttpResponse("登入成功!") else: form = LoginForm() return render(request,'login.html',{'form':form})

建立對應的模板 login.html

<!DOCTYPE html>
<html lang
="en">
<head> <meta charset="UTF-8"> <title>form demo</title> </head> <body> <div align="center" style="height: 400px;width: 100px"> <form action="#" method="post"> {% csrf_token %} {{ form }} <button type="submit" id='sum'>提交</button> </form> </div> </body> </html>

配置 urls 一些基本的配置(比如模板,路由)就直接跳過了。

直接訪問地址就顯示出這樣一個簡單的介面,由html檔案可以看到並沒有js程式碼對資料有效性進行驗證,但此時如果不輸入內容或輸入錯誤格式提交時,會在錯誤欄下方直接提示相關錯誤資訊。
這便是django表單的一個簡單驗證功能。
當我填寫了一些內容,還未提交直接重新整理時,重新整理後的介面仍然保留有我已輸入的內容(在實際專案中,是提交後,後臺可能驗證賬號不存在等等錯誤會返回這個介面並且輸入的內容仍然存在)。這就是django的一個回顯功能。

定製表單

  如果剛接觸Django表單的話,可能會覺得它很神奇,前端一個 {{ form }} 就能做出一個完整強大的表單。但熟悉了一會後,新鮮勁一過就又會覺得這有什麼用?就為了前端省幾行程式碼?耦合性這麼高用它幹嘛?

使用一種東西就會受制於一種東西,但這並不是django的原意。並非你接收了django表單的方便就要接受這麼醜陋的頁面。Django表單是可以隨你心意定製的:
比如
  後臺中,我 forms.py 的欄位只能用字母下劃線作名稱,我前端就一定要接受這個名嗎?

account = forms.CharField(label='賬號',max_length=8)

這裡寫圖片描述
  不但對標籤名進行了定製化,還限制了輸入的位數,我限制了八位就只能輸入八位,第九位是無法輸入的。

  並非所有的資訊都是強制的,根據需要來抉擇。

email = forms.EmailField(required=False)

  這樣一來,即使 email 空著不填,表單也能夠正常提交

美化表單

  每個表單欄位都有一個對應的 Widget class ,它對應一個 HTML 表單 Widget
我們可以使用 Forms 中的 widget 來對我們的前端表單按我們的要求進行改造:
當我們需要一個長文字輸入框時:comment = forms.CharField(widget=forms.Textarea)
當我們想做一個下拉框時:

from django.forms.extras.widgets import SelectDateWidget
years = ('2001','2002','2003')

year = forms.DateField(widget=SelectDateWidget(years=years))

對於 ChoiceField欄位,Forms預設的是繼承select的widget,即使用HTML的列表形式< select > ,而 RadioSelect 使用單選按鈕。

如果想要某一個輸入框看起來更特別,不一樣的話,你可以這樣做:
comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'}))
為其設定attrs,也就是HTML中的css屬性。

如果你想要為整個表單或者是更深度的定製一些css以及JavaScript,可以前往Django官方文件瞭解更多

Forms表單欄位

Field.clean(value)

雖然欄位類主要使用在表單類中,但你也可以直接例項化它們來使用,以便更好地瞭解它們是如何工作的。每個欄位例項都有一個clean()方法, 它接受一個引數,然後返回“清潔的”資料或者丟擲一個django.forms.ValidationError異常:

>>> from django import forms
>>> f = forms.EmailField()
>>> f.clean('[email protected]')
'[email protected]'
>>> f.clean('invalid email address')
Traceback (most recent call last):
...
ValidationError: ['Enter a valid email address.']

欄位的核心引數
每個欄位類的建構函式至少接受這些引數。有些欄位類接受額外的、欄位特有的引數,但以下引數應該總是能接受:

Field.required

預設情況下,每個欄位 類都假設必需有值,所以如果你傳遞一個空的值 —— 不管是None 還是空字串(“”) —— clean() 將引發一個ValidationError 異常。

Field.label

正如在前面“輸出表單為HTML”中解釋的,欄位預設label 是通過將欄位名中所有的下劃線轉換成空格並大寫第一個字母生成的。如果預設的標籤不合適,可以指定label。

>>> from django import forms
>>> class CommentForm(forms.Form):
...     name = forms.CharField(label='Your name')
...     url = forms.URLField(label='Your Web site', required=False)
...     comment = forms.CharField()
>>> f = CommentForm(auto_id=False)
>>> print(f)
<tr><th>Your name:</th><td><input type="text" name="name" /></td></tr>
<tr><th>Your Web site:</th><td><input type="url" name="url" /></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
Field.label_suffix

label_suffix 引數讓你基於每個欄位覆蓋表單的label_suffix。

>>> class ContactForm(forms.Form):
...     age = forms.IntegerField()
...     nationality = forms.CharField()
...     captcha_answer = forms.IntegerField(label='2 + 2', label_suffix=' =')
>>> f = ContactForm(label_suffix='?')
>>> print(f.as_p())
<p><label for="id_age">Age?</label> <input id="id_age" name="age" type="number" /></p>
<p><label for="id_nationality">Nationality?</label> <input id="id_nationality" name="nationality" type="text" /></p>
<p><label for="id_captcha_answer">2 + 2 =</label> <input id="id_captcha_answer" name="captcha_answer" type="number" /></p>
Field.initial

initial 引數讓你指定渲染未繫結的表單中的欄位時使用的初始值。

Field.widget

widget 引數讓你指定渲染表單時使用的Widget 類。更多資訊參見Widgets。

Field.help_text

help_text 引數讓你指定欄位的描述文字。如果提供help_text,在通過表單的便捷方法(例如,as_ul())渲染欄位時,它將緊接著欄位顯示。

Field.error_messages

error_messages 引數讓你覆蓋欄位引發的異常中的預設資訊。傳遞的是一個字典,其鍵為你想覆蓋的錯誤資訊。

Field.validators

validators 引數讓你可以為欄位提供一個驗證函式的列表。

Field.localize

localize 引數啟用表單資料的本地化,包括輸入和輸出。

是否已經改變

Field.has_changed()

has_changed() 方法用於決定欄位的值是否從初始值發生了改變。返回True 或False。

內建欄位

class BooleanField(**kwargs)
  • 預設的Widget:CheckboxInput
  • 空值:False
  • 規範化為:Python 的True 或 False。
  • 如果欄位帶有required=True,驗證值是否為True(例如複選框被勾上)。
  • 錯誤資訊的鍵:required
class CharField(**kwargs)
  • 預設的Widget:TextInput
  • 空值:’ ‘(一個空字串)
  • 規範化為:一個Unicode 物件。
  • 如果提供,驗證max_length 或min_length。 否則,所有的輸入都是合法的。
  • 錯誤資訊的鍵:required, max_length, min_length
  • 可選引數:max_length, min_length
class ChoiceField(**kwargs)
  • 預設的Widget:Select
  • 空值:”(一個空字串)
  • 規範化為:一個Unicode 物件。
  • 驗證給定的值在選項列表中存在。
  • 錯誤資訊的鍵:required, invalid_choice
  • 可選引數:choices
class TypedChoiceField(**kwargs)
  • 預設的Widget:Select
  • 空值:empty_value
  • 規範化為:coerce 引數型別的值。
  • 驗證給定的值在選項列表中存在並且可以被強制轉換。
  • 錯誤資訊的鍵:required, invalid_choice
  • 可選引數:coerce,empty_value
class DateField(**kwargs)
  • 預設的Widget:DateInput
  • 空值:None
  • 規範化為:一個Python datetime.date 物件。
  • 驗證給出的值是一個datetime.date、datetime.datetime 或指定日期格式的字串。
  • 錯誤資訊的鍵:required, invalid
  • 可選引數:input_formats
class DateTimeField(**kwargs)
  • 預設的Widget:DateTimeInput
  • 空值:None
  • 規範化為:一個Python datetime.datetime 物件。
  • 驗證給出的值是一個datetime.date、datetime.datetime 或指定日期格式的字串。
  • 錯誤資訊的鍵:required, invalid
  • 可選引數:input_formats
class DecimalField(**kwargs)
  • 預設的Widget:當Field.localize 是False 時為NumberInput,否則為TextInput。
  • 空值:None
  • 規範化為:一個Python decimal。
  • 驗證給定的值為一個十進位制數。忽略前導和尾隨的空白。
  • 錯誤資訊的鍵:required, invalid, max_value, min_value, max_digits, max_decimal_places, max_whole_digits
  • 四個可選的引數:max_value,min_value,max_digits,decimal_places
class DurationField(**kwargs)
  • 預設的Widget:TextInput
  • 空值:None
  • 規範化為:一個Python timedelta。
  • 驗證給出的值是一個字串,而可以給轉換為timedelta。
  • 錯誤資訊的鍵:required, invalid.
class EmailField(**kwargs)
  • 預設的Widget:EmailInput
  • 空值:”(一個空字串)
  • 規範化為:一個Unicode 物件。
  • 驗證給出的值是一個合法的郵件地址,使用一個適度複雜的正則表示式。
  • 錯誤資訊的鍵:required, invalid
class FileField(**kwargs)
  • 預設的Widget:ClearableFileInput
  • 空值:None
  • 規範化為:一個UploadedFile 物件,它封裝檔案內容和檔名為一個單獨的物件。
  • 可以驗證非空的檔案資料已經繫結到表單。
  • 誤資訊的鍵:required, invalid, missing, empty, max_length
class FilePathField(**kwargs)
  • 預設的Widget:Select
  • 空值:None
  • 規範化為:一個Unicode 物件。
  • 驗證選擇的選項在選項列表中存在。
  • 錯誤資訊的鍵:required, invalid_choice
  • 它接受三個額外的引數;只有path 是必需的:

path,你想要列出的目錄的絕對路徑。這個目錄必須存在。
recursive,如果為False(預設值),只用直接位於path 下的檔案或目錄作為選項。如果為True,將遞迴訪問這個目錄,其所有的子目錄和檔案都將作為選項。
match,正則表示式表示的一個模式;只有匹配這個表示式的名稱才允許作為選項。
allow_files,可選。為True 或False。預設為True。表示是否應該包含指定位置的檔案。它和allow_folders 必須有一個為True。
allow_folders,可選。為True 或False。 預設為False。表示是否應該包含指定位置的目錄。 它和allow_files 必須有一個為True。

class FloatField(**kwargs)
  • 預設的Widget:當 Field.localize 是False 時為NumberInput,否則為TextInput。
  • 空值:None
  • 規範化為:一個Float 物件。
  • 驗證給出的值是一個浮點數。和Python 的float() 函式一樣,允許前導和尾隨的空白符。
  • 錯誤資訊的鍵:required, invalid, max_value, min_value
class ImageField(**kwargs)
  • 預設的Widget:ClearableFileInput
  • 空值:None
  • 規範化為: An UploadedFile object that wraps the file content and file name into a single object.
  • 驗證檔案資料已繫結到表單,並且該檔案具有Pillow理解的影象格式。
  • 錯誤資訊的鍵:required, invalid, missing, empty, invalid_image
class IntegerField(**kwargs)
  • 預設的Widget:當Field.localize 是False 時為NumberInput,否則為TextInput。
  • 空值:None
  • 規範化為:一個Python 整數或長整數。
  • 驗證給定值是一個整數。允許前導和尾隨空格,如Python的int()函式。
  • 錯誤資訊的鍵:required, invalid, max_value, min_value
  • 可選引數:max_value,min_value
class GenericIPAddressField(**kwargs)

包含IPv4或IPv6地址的欄位。

  • 預設的Widget:TextInput
  • 空值:”(一個空字串)
  • 規範化為:一個Unicode 物件。 IPv6地址如下所述進行歸一化。
  • 驗證給定值是有效的IP地址。
  • 錯誤資訊的鍵:required, invalid
  • 可選引數:protocol,unpack_ipv4
class MultipleChoiceField(**kwargs)
  • 預設的Widget:SelectMultiple
  • 空值:[](一個空列表)
  • 規範化為:一個Unicode 物件列表。
  • 驗證給定值列表中的每個值都存在於選擇列表中。
  • 錯誤資訊的鍵:required, invalid_choice, invalid_list
class TypedMultipleChoiceField(**kwargs)

就像MultipleChoiceField,除了TypedMultipleChoiceField需要兩個額外的引數,coerce和empty_value。

  • 預設的Widget:SelectMultiple
  • 空值:empty_value
  • 規範化為:coerce引數提供的型別值列表。
  • 驗證給定值存在於選項列表中並且可以強制。
  • 錯誤資訊的鍵:required, invalid_choice
class NullBooleanField(**kwargs)
  • 預設的Widget:NullBooleanSelect
  • 空值:None
  • 規範化為:一個Python True, False 或None 值。
  • 不驗證任何內容(即,它從不引發ValidationError)。
class RegexField(**kwargs)
  • 預設的Widget:TextInput
  • 空值:”(一個空字串)
  • 規範化為:一個Unicode物件
  • 驗證給定值與某個正則表示式匹配。
  • 錯誤資訊的鍵:required, invalid
class SlugField(**kwargs)
  • 預設的Widget:TextInput
  • 空值:None
  • 規範化為:一個Python 的datetime.time 物件。
  • 驗證給定值是datetime.time或以特定時間格式格式化的字串。
  • 錯誤資訊的鍵:required, invalid
class TimeField(**kwargs)
  • 預設的Widget:TextInput
  • 空值:None
  • 規範化為:一個Python 的datetime.time 物件。
  • 驗證給定值是datetime.time或以特定時間格式格式化的字串。
  • 錯誤資訊的鍵:required, invalid
class URLField(**kwargs)
  • 預設的Widget:URLInput
  • 空值:”(一個空字串)
  • 規範化為:一個Unicode 物件。
  • 驗證給定值是有效的URL。
  • 錯誤資訊的鍵:required, invalid
class UUIDField(**kwargs)
  • 預設的Widget:TextInput
  • 空值:”(一個空字串)
  • 規範化為:一個UUID 物件。
  • 錯誤資訊的鍵:required, invalid
  • 複雜點的內建Field類
class ComboField(**kwargs)
  • 預設的Widget:TextInput
  • 空值:”(一個空字串)
  • 規範化為:一個Unicode 物件。
  • 根據指定為ComboField的引數的每個欄位驗證給定值。
  • 錯誤資訊的鍵:required, invalid
class MultiValueField(fields=(), **kwargs)
  • 預設的Widget:TextInput
  • 空值:”(一個空字串)
  • 規範化為:子類的compress方法返回的型別。
  • 針對指定為MultiValueField的引數的每個欄位驗證給定值。
  • 錯誤資訊的鍵:required, invalid, incomplete
class SplitDateTimeField(**kwargs)
  • 預設的Widget:SplitDateTimeWidget
  • 空值:None
  • 規範化為:一個Python datetime.datetime 物件。
  • 驗證給定的值是datetime.datetime或以特定日期時間格式格式化的字串。
  • 錯誤資訊的鍵:required, invalid, invalid_date, invalid_time
  • 處理關係的欄位
    兩個欄位可用於表示模型之間的關係:ModelChoiceField和ModelMultipleChoiceField。這兩個欄位都需要單個queryset引數,用於建立欄位的選擇。在表單驗證時,這些欄位將把一個模型物件(在ModelChoiceField的情況下)或多個模型物件(在ModelMultipleChoiceField的情況下)放置到cleaned_data表單的字典。

對於更復雜的用法,可以在宣告表單欄位時指定queryset=None,然後在窗體的init()方法中填充queryset:

class FooMultipleChoiceForm(forms.Form):
    foo_select = forms.ModelMultipleChoiceField(queryset=None)

    def __init__(self, *args, **kwargs):
        super(FooMultipleChoiceForm, self).__init__(*args, **kwargs)
        self.fields['foo_select'].queryset = ...
class ModelChoiceField(**kwargs)
  • 預設的Widget:Select
  • 空值:None
  • 規範化為:一個模型例項。
  • 驗證給定的id存在於查詢集中。
  • 錯誤資訊的鍵:required, invalid_choice
class ModelMultipleChoiceField(**kwargs)
  • 預設的Widget:SelectMultiple
  • 空值:QuerySet (self.queryset.none())
  • 規範化為: 模型例項的一個QuerySet。
  • 驗證在給定的值列表中的每個id存在於查詢集中。
  • 錯誤資訊的鍵:required, list, invalid_choice, invalid_pk_value
  • 建立自定義的欄位
    如果內建的欄位不能滿足你的需求,你可以很容易地建立自定義的欄位。你需要建立django.forms.Field 的一個子類。它只要求實現一個clean() 方法和接收上面核心引數的init() 方法(required, label, initial, widget, help_text)。

相關推薦

Django魅力 ——優雅操作

Django 中的表單   表單,在前端頁面中屬於最常見的一個東西了。基本上網站資訊的提交都用到了表單,記得剛學習前端頁面時就照著網上的例子敲了一個登入的表單。話不多說,來看一看Django中優雅的表單系統:Form Form 表單的功能 自

Django使用普通、Form、以及modelForm操作數據庫方式總結

信息 自定義字段 turn html 缺點 tin 顯示時間 流程 req Django使用普通表單、Form、以及modelForm操作數據庫主要應用於增刪該查的情景下,流程通用如下,只是實現方式不一樣: 進入填寫表單頁面; 在表單頁面填寫信息,並提交; 表單數

django中的 form 操作

格式化 esp cal hold offset row exception 價格 文件顯示 1. 定義 from django import forms # 定義form class RegForm(fo rms.Form): user = forms

jqm文件上傳,上傳圖片,jqm的操作,jqm的ajax的使用,jqm文件操作大全,文件操作demo

今天 south eth 1.8 get pri pos nis gravity 近期在論壇中看到。在使用html5中上傳圖片或文件,出現各種問題。這一方面,我也一直沒有做過,今天就抽出了一點時間來學習一下。如今的演示樣例已經ok了,我就給大家分享一下,希望對大家有幫助

django中處理的經典流程

contex 用戶 通過 eth ret span quest con 信息 def form_process_view(request): if request.method == ‘POST‘: # 請求為 POST,利用用戶提交的數據構造一個

Django--分頁器(paginator)、Django的用戶認證、Django的FORM

modelform 從數據 submit fields 個人 select method rtc 無法使用 分頁器(paginator) >>> from django.core.paginator import Paginator >>&g

Django-Django的form

valid blog pos ges 驗證 錯誤 form表單 技術分享 orm 註冊頁面如果用ajax來做,視圖views裏面判斷會很復雜,需要判斷各種字段,我們用form來做 form_obj,實例化form_post(form_obj)對象,一定要加上(reque

angular 操作

對象 用戶 loop 自動 .class 按鍵事件 有關 狀態 。。   一直沒有使用angular的表單驗證以及表單提交數據。只是用的input綁定值,另外最近的設計都是點擊後顯示錯誤,而不是自動顯示錯誤。所以錯誤顯示一直也沒有做。而表單的非法驗證可以直接解決這個問題。a

71、Django之form

protoc valid init title except Go doc 列表 ima Form介紹 我們之前在HTML頁面中利用form表單向後端提交數據時,都會寫一些獲取用戶輸入的標簽並且用form標簽把它們包起來。 與此同時我們在好多場景下都需要對用戶的輸入做校驗

Django---簡單接受信息

inpu sele opp div color etl 表單 req class 普通接受信息: 接受單選的值:例如:input select 等提交過來的信息 u = request.POST.get(‘username‘,None) 接受多選: h = reque

基於jQuery的操作

content 瀏覽器 area show legend ins 並不是 彌補 span 1,文本框的聚焦和失焦 在對文本框進行操作時,通常為了提升用戶體驗,是用戶的操作得到及時的反饋,會在文本框獲得焦點時,讓其顏色改變,然後在失去焦點時恢復為原來的樣式,一般情況下,我們可

selenium多操作與多窗口,以及警告框處理

itl 很快 hand phone from close 註冊頁面 需要 http 知識是需要經常溫習的,不然是很容易遺忘的。 以前自己操作IFRAME,多窗口的時候,覺得很簡單。半年沒有操作自動化了,知識又還了回去。 寫博客有一個好處,可以把自己記住的知識點記錄下來,這樣

Django之form那點事

bootstrap msg 價格 code cap 愛好 ots exce 同時 Form介紹 我們之前在HTML頁面中利用form表單向後端提交數據時,都會寫一些獲取用戶輸入的標簽並且用form標簽把它們包起來。 與此同時我們在好多場景下都需要對用戶的輸入做校驗,比

Django 之 form

its html rom ida cal 從數據 disable ger orm Django中的Form表單   1、背景     平時我們在書寫form表單時,經常都是手動的去寫一些input標簽,讓用戶輸入一些功能,進行一些校驗的判斷,等等。Django中的for

Django之form

所有 install rip mod 由於 合格 NPU enc 多選框 Form介紹 總結,form組件的主要功能如下:   生成頁面可用的HTML標簽   對用戶提交的數據進行校驗   保留上次輸入內容   提示錯誤信息 普通方式手寫註冊功能 views.

Django 使用form提交數據報錯: Forbidden (403)

運行 ges info auth 技術 sage ons 提交數據 smi Issue: 使用from表單submit之後報錯入下: Action: 把django工程文件的setting.py中的django.middleware.csrf.CsrfViewMi

Django之form詳解

構建一個表單 假設你想在你的網站上建立一個簡單的表單,以獲得使用者的名字。你需要類似這樣的模板: <form action="/your-name/" method="post"> <label for="your_name">Your name: </labe

Django的form

編輯 pty form表單 get required this 長度 wrapper -- 一.構建一個表單 假設你想在你的網站上創建一個簡單的表單,以獲得用戶的名字。你需要類似這樣的模板: 1 2 3 4 5 <form action="/you

Django框架form的那些事兒

Form那些事兒 建立Form類時,主要涉及到 【欄位】 和 【外掛】,欄位用於對使用者請求資料的驗證,外掛用於自動生成HTML;   1:initial 初始值,input框裡面的初始值。 class LoginForm(forms.Form): username = fo

form操作

初始 box style idg ... formats roo ces mef Django的Form主要具有一下幾大功能: 生成HTML標簽 驗證用戶數據(顯示錯誤信息) HTML Form提交保留上次提交數據 初始化頁面顯示內容 簡單例子