Django Form基於Model定義表單

2021-02-19 方舟編譯器開源

在本章中我們講解最後一個知識點,即基於 Model 模型類定義數據表,這種業務場景也是我們在實際的開發工作中經常遇到的,比如我們要添加一本書籍,這個頁面中的表單欄位就需要與 Book 的 Model 定義相對應。利用 Form 對象並不難實現,只需要將 Model 中定義的欄位對應成 Form 的對象中的表單欄位就可以了,但是這時候也存在一個問題,就是如果這種需要對應的 Model 較多的時候,且 Model 中定義的欄位也較多,那麼重複實現這種表單的過程就會變成機械式的重複。

1. 初識表單系統ModelForm

Django 的表單系統充分考慮到這個問題,並給開發者提供了 ModelForm,使用它就可以實現基於 Model 的定義自動生成表單,這就大大簡化了根據 Model 生成表單的過程,很好解決了我們遇到的問題,下面就讓我們一起來看一下,它是如何實現這個過程的吧。

1) 實現一個簡單的ModelForm

首先,我們來實現一個簡單的 ModelForm 主要看它的使用方法以及在使用它的時候有哪些需要我們注意的事項。下面,編寫如下代碼:

class BookModelForm(forms.ModelForm):    class Meta:        model=Book        labels={'price':'零售價格'}        exclude=('retail_price')

ModelForm 需要使用 Meta 來設置必要的元數據信息,這樣 Model 的元數據項不謀而合,我們在 Meta 中設置三個選項:model 指定了需要生成表單的模型對象;labels 為字典類型,用於定義表單欄位的名稱,當然這裡大家需要注意一下,表單的名稱首先默認使用 Model欄位設置的 verbose_name,但是若 Model 欄位沒有設置該欄位選項,則就可以使用 lables 設置的欄位名;exclude 標識不需要在表單中顯示的欄位,這和 Model 的 Meta 也一樣。


ModelForm 的使用方法與 Form 類似,同樣也可以使用 is_valid 方法來校驗欄位值的合法性和通過 cleaned_data 屬性獲取清理後的欄位值,另外, ModelForm 也會校驗模型欄位中設置的限制條件,比如在 Model 模型的欄位中添加了 unique 選項,那麼 is_valid 則會查詢資料庫確認是否存在重複數據。

2. 使用ModeForm定義表單

將表單應用到視圖函數中才是有意義的,下面我們就實現用戶添加的功能通過 ModelForm 來實現,首先在 index 目錄下創建模板文件 useradd_model_form.html 文件,編寫代碼如下所示:


<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>用戶添加</title></head><body><form action="" method="post"> {% csrf_token %} <table> {{ form }} </table> <input type="submit" value="提交"> </form></body></html>

上面代碼有兩個需要注意的地方:由於指定了 POST 請求類型,需要 CSRF 保護機制,所以添加了 {%csrf_token%} 模板標籤;action 沒有設定 URL 的意思是將表單提交到與當前頁面相同的 URL。接下來實現 UserModelForm 並在視圖函數中應用它,代碼如所示:

class UserModelForm(forms.ModelForm):    class Meta:        model=UserInfo        fields="__all__"        widgets={'password':widgets.PasswordInput()}def user_add_form(request):    if request.method=="Post":        user=UserModelForm(request.Post)        if user.is_valid():            user=UserInfo.objects.create(username=user.cleaned_data['username'],                                         password=user.cleaned_data["password"],                                         gender=user.cleaned_data['gender'])                        return render(request,'index/user_add.html',locals())        else:            return render(request,'index/useradd_model_form.html',context={'form':user})    else:        return render(request,'index/useradd_model_form.html',{'form':UserModelForm()})urlpatterns=[path('user_add_form/',views.user_add_form)]

最後訪問 127.0.01:8000/index/user_add_form/ 可得如下頁面:


圖1:Django ModelForm定義表單
 

視圖函數 user_add_form 邏輯也不是很複雜,下面我們簡單總結一下:首選如果是 POST 請求,且表單欄位值合法,則創建 user 對象實例,然後是 POST 請求,但表單欄位值不合法,則返回表單頁面同時顯示錯誤提示信息,最後若不是 POST 請求,顯示錶單頁面。

通過上面的講解,我們使用 ModelForm 定義了好一個基本的用戶註冊表單,並把它應用到了視圖函數中,這也是通過它實現定義表單的基本流程。當然關於 ModelForm 還有一些基本知識沒有介紹,比如說它的 Meta 選項,還有它的 save 方法,在一節《Django ModelForm用法詳解》我們會作出講解。 

相關焦點

  • Django Form表單完整使用流程
    編寫如下代碼定義 Form 表單欄位:from django import formsclass TitleSearch(forms.Form): title=forms.CharField(label='書名',label_suffix='',error_messages={'required':'請輸入正確的title'})
  • Django Form表單API詳解
    Django 表單系統功能非常強大,它可以實現對欄位的驗證,而且還可以根據欄位定義生成 HTML,在本節我們通過一些 Form 表單的 API,
  • Django ModelForm用法詳解
    在上一節《Django Form基於Model定義表單》我們使用 ModelForm 定義了一個基於模型 UserInfo 的一張表單,整個實現的過程也非常的類似於
  • Django限制表單中ForeignKey對應下拉菜單選項數量的兩種經典方法
    從ArticleForm定義我們可得知,ArticleForm類沒有指定顯示何種類別,所以默認將顯示所有類別。或許你想嘗試修改ArticleForm的定義來將類別選項限定於作者自己創建的類別,但卻找不到真正的突破口。
  • 8個能提高Django開發效率的Python包
    describe_form將顯示模型的表單定義,然後您可以將其複製/粘貼到forms.py中。(注意,這將生成一個普通的Django表單,而不是一個模型表單。) notes命令可以在整個項目中顯示所有帶有TODO、FIXME等內容的注釋。Django-extensions中還包含一些有用的抽象基類,可用於您自己的模型中。
  • Django實戰教程: 開發企業級應用智能文檔管理系統smartdoc(1)
    在Document模型裡, 我們定義get_format方法用來快速獲取文件格式。:    model = Product    template_name = 'smartdoc/form.html'    form_class = ProductForm    # Associate form.instance.user with self.request.user    def form_valid(self, form):
  • 一篇文章帶你了解Django Form組件(入門篇)
    Form組件主要用於驗證表單數據。為什麼需要Form組件注:Form組件,只適用於,前後端未分離的項目中,主要用於驗證表單數據,所以,關鍵字是表單!!!比如像嗶哩嗶哩的註冊界面。,因為html form表單提交是刷新頁面提交的!霧草,沒了,這是少的,如果有十幾個???,那不就氣死了好像我記得我上學時,好多網站都是這。。。好像我也罵了很久,直到前後端分離時,才好一點!
  • python程式設計師嘔心瀝血整理 Django 優秀資源大全
    django-countries, star:359 - 為表單提供國家選擇,也基於國旗選擇,還提供一個 CountryField。django-enumfield, star:99 - 基於命名常數列表的 Django 定製數據項(1 看未更新)。
  • Django 2.0 項目實戰: 擴展Django自帶User模型,實現用戶註冊與登錄
    由於Django Auth自帶的User模型欄位有限,我們還需要自定義模型UserProfile對其擴展。自定義的UserProfile模型user: 與User是1對1關係org:用戶名telephone: 電話mod_date: 最後修改日期。
  • Django表單系統工作原理詳述
    通過繼承 Form 對象,定義所需要的表單欄位,基本上完成了表單的定義。它可以自動生成 HTML,完成欄位值的校驗,並給出相應錯誤的提示信息。
  • html中form表單標籤的詳細介紹
    本篇將介紹的是html中form表單標籤的用法,有興趣的朋友可以學習一下!在html中,表單是經常用到的,用來與用戶交互並提交數據。今天要介紹的就是表單標籤form標籤,接下來我們就一起來看看它的用法吧!「form」作為英文單詞有「表格」的意思,那它在html中作為標籤又充當什麼樣的角色呢!
  • HTML中表單form的相關知識
    如果一個表單對象定義如下: <form name="frm1" method="post" action="login.aspx"> 獲得該表單對象的方法: 這個屬性的默認值為:application/x-www-form-urlencoded如果要上傳文件,則應該設置為:multipart/form-dataform 表單中的<label> 標記:每一個表單元素的文字描述都應該使用<label> 標記!
  • 前端入門須知:輕鬆學會form表單製作!
    二、表單元素一個完整的表單包含三個基本組成部分:表單標籤、表單域、表單按鈕。1.表單標籤是指<form>標籤本身,它是一個包含表單元素的區域,使用<form></form>定義 2.表單域是<form>標籤中用來收集用戶輸入的每一項,通常用input標籤來定義,input
  • Django第二十八課
    本部分內容參考B站UP再敲一行代碼的Django2教程[1]⚠️:多圖預警第二十八課 自定義用戶模型在上節課登錄功能中,我們提到了個人資料。這節課我們繼續講述關於個人資料中的用戶自定義內容。我們找到django/contrib/auth/models.py文件,打開後可以發現Django的用戶模型是繼承了一個Abstractuser類,我們可以重新定義User。1.1 新建一個mysite_test文件為了不影響我們之前的文件,我們複製mysite文件,新建一個名為mysite_test的文件夾,在其中進行新User的定義。
  • Python——用 Django 寫 restful api 接口
    admin.py (https://code.ziqiangxuetang.com/django/django-admin.html)—— 後臺,可以用很少量的代碼就擁有一個強大的後臺。還得在工程目錄的 settings.py 文件在配置INSTALLED_APPS = [   'django.contrib.admin',   'django.contrib.auth',   'django.contrib.contenttypes',   'django.contrib.sessions',   'django.contrib.messages
  • 如何在vue項目中使用muse-ui並創建一個form表單提交
    Muse UI是基於vue的開源組件庫,包含了不同的控制項;可以自定義主題,實現定製化。如果在vue項目中,如何使用muse-ui?cnpm install --global vue-cli3、使用vue init命令初始化項目,創建基於webpack模板的項目vue init
  • 基於web的自定義表單引擎
    所謂表單引擎表單引擎,又可稱之為表單流程、流程表單、工作流表單,是基於Web界面上可視化編輯的表單設計系統,可設置資料庫的欄位、屬性,設置模塊的配置。用表單引擎系統快速定義出其他系統,如:行政管理、進銷存、客戶關係、採購審批、請假單、通訊錄、人事檔案、運營推廣等。表單引擎工具FormstackFormstack上可以搭建線上流程審核表單,十分方便。另外,Formstack對於受到高度管制的行業(如銀行、科研、高精尖科技公司之類,對數據隱私保護要求非常高的行業)也很適合。
  • Django HTML表單實現用戶登錄退出(含源碼)
    HTML表單實現用戶的登錄通過前一節的學習,通過 HTML 表單並不難實現用戶的登錄功能,那麼大家先思考一下,用戶登錄的邏輯打開是怎麼樣的呢?分析這個邏輯,大家也可以去體驗一下其他網站的登錄功能,從用戶的註冊到登錄最後用戶退出,這整個的流程都需要大家細細的品味,並發現其中的規律,並且學以致用。當自己不熟練的時候,學會去借鑑其他人的經驗,往往是一個不錯的選擇。
  • 使用React和HTML5表單驗證API處理表單
    DevKit中的表單如果你喜歡去的devkit ReactBootstrap或AntDesign你很可能已經高興的形式。兩者都提供組件來構建滿足不同要求的表單。例如,在AntDesign中,我們使用元素和帶有的表單欄位來定義表單,該 是集合中任何輸入控制項的封裝。
  • 曬碼姐講堂——創建Form表單實例
    任何一個伺服器腳本語言最常見的應用場景就是處理html表單,我們通過創建一個書店圖書的錄入實例開始學習PHP.首先,我們先看form表單:form表單都是成對出現的。<form ></form> 我們都是把需要提交的數據信息寫到這個表單裡面,提交才可以,如果寫到外面,是獲取不到信息的。