Django基礎(9): 表單Forms的高級使用技巧

2022-01-02 Python Web與Django開發

收錄於話題 #Django基礎連載 40個

本文是Django基礎(5): 表單forms的設計與使用的進階篇。上文裡我們介紹了如何設計表單(forms),如何使用表單及進行表單驗證。這次我們將分享些Django表單的一些高級使用技巧。辛苦碼字不易,歡迎轉載點讚!

自定義欄位屬性和錯誤信息

對於每個欄位你可以設置其是否為必需,最大長度和最小長度。你還可以針對每個屬性自定義錯誤信息,見下面代碼。

from django import forms


class LoginForm(forms.Form):  
   username = forms.CharField(
       required=True,
       max_length=20,
       min_length=6,
       error_messages={
           'required': '用戶名不能為空',
           'max_length': '用戶名長度不得超過20個字符',
           'min_length': '用戶名長度不得少於6個字符',
       }
   )
   password = forms.CharField(
       required=True,
       max_length=20,
       min_length=6,
       error_messages={
           'required': '密碼不能為空',
           'max_length': '密碼長度不得超過20個字符',
           'min_length': '密碼長度不得少於6個字符',
       }
   )

對於基繼承ModelForm類的表單, 我們可以在Meta選項下widget中來自定義錯誤信息,如下面代碼所示:

from django.forms import ModelForm, Textarea
from myapp.models import Author


class AuthorForm(ModelForm):
   class Meta:
       model = Author
       fields = ('name', 'title', 'birth_date')
       widgets = {
           'name': Textarea(attrs={'cols': 80, 'rows': 20}),  # 關鍵是這一行
       }
       labels = {
           'name': _('Author'),
       }
       help_texts = {
           'name': _('Some useful help text.'),
       }
       error_messages = {
           'name': {
               'max_length': _("This writer's name is too long."),
           },
       }


自定義表單輸入的widget和css屬性

Django forms的每個欄位你都可以選擇你喜歡的輸入widget,比如多選,複選框。你還可以定義每個widget的css屬性。如果你不指定,Django會使用默認的widget,有時比較醜。

比如下面這段代碼定義了表單姓名欄位的輸入控制項為Textarea,還指定了其樣式css。

from django import forms


class ContactForm(forms.Form):
   name = forms.CharField(
       max_length=255,
       widget=forms.Textarea(
           attrs={'class': 'custom'},
       ),
   )

設置widget可以是你的表單大大美化,方便用戶選擇輸入。比如下面案例裡對年份使用了SelectDateWidget,顏色則使用了複選框CheckboxSelectMultiple。單選可以用RadioSelect和Select。常見文本輸入可以用TextInput和TextArea。

from django import forms

BIRTH_YEAR_CHOICES = ('1980', '1981', '1982')
COLORS_CHOICES = (
   ('blue', 'Blue'),
   ('green', 'Green'),
   ('black', 'Black'),
)

class SimpleForm(forms.Form):
   birth_year = forms.DateField(widget=forms.SelectDateWidget(years=BIRTH_YEAR_CHOICES))
   favorite_colors = forms.MultipleChoiceField(
       required=False,
       widget=forms.CheckboxSelectMultiple,
       choices=COLORS_CHOICES,
   )


表單數據初始化和實例化

有時我們需要對表單設置一些初始數據,我們可以通過initial方法,如下所示。

form = ContactForm(
   initial={
       'name': 'First and Last Name',
   },)

其編輯修改類應用場景中,我們還要給表單提供現有對象的數據,而不是渲染一張空表單。這個過程叫表單與數據的結合。

對於由繼承ModelForm類的表單,我們可以按如下方法對表單進行實例化,如下面代碼所示:

contact = Contact.objects.get(id=1)
form =  ContactForm(instance = contact)

對於自定義的表單,可以設置default_data。對於用戶提交的數據,括號裡可以使用request.POST。

default_data = {'name': 'John', 'email': 'someone@hotmail.com', }
form = ContactForm(default_data)

自定義表單驗證validators

對於表單驗證除了通過clean方法自定義驗證外,你還可以選擇自定義validators。例如下面案例中,如果用戶輸入的手機號不符合要求,表單就會返回手機號碼格式錯誤的驗證信息。

from django.core.exceptions import ValidationError
import re


def mobile_validate(value):
   mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
   if not mobile_re.match(value):
       raise ValidationError('手機號碼格式錯誤')


class UserInfo(forms.Form):
   email = forms.EmailField(error_messages={'required': u'郵箱不能為空'},)
   mobile = forms.CharField(validators=[mobile_validate, ],
                            error_messages={'required': u'手機不能為空'},
                            widget=forms.TextInput(attrs={'class': "form-control",
                                                         'placeholder': u'手機號碼'}),)

一個頁面同時提交2張或多張表單

很多情況下我們希望用戶在同一頁面上點擊一個按鈕能同時提交2張或多張表單,這時我們可以在模板中給每個表單取不同的名字,如form1和form2(如下面代碼所示)。注: form1和form2分別對應forms.py裡的Form1()和Form2()。

<form >
   {{ form1.as_p }}
   {{ form2.as_p }}
</form>

然後用戶點擊提交後,我們就可以在視圖裡了對用戶提交的數據進行分別處理了,如下面代碼所示。

if request.method == 'POST':
       form1 = Form1( request.POST,prefix="form1")
       form2 = Form2( request.POST,prefix="form2")
       
       if form1.is_valid() or form2.is_valid():
           pass
else:
       form1 = Form1(prefix="form1")
       form2 = Form2(prefix="form2")

相關焦點

  • Django Form表單完整使用流程
    ,我們可以嘗試使用表單系統來實現這個功能了,在本節我們將匯總相關知識點,以此來講解如何使用 Form 表單系統完成實際功能的開發。編寫如下代碼定義 Form 表單欄位:from django import formsclass TitleSearch(forms.Form): title=forms.CharField(label='書名',label_suffix='',error_messages={'required':'請輸入正確的title'})
  • Django Form表單API詳解
    Form表單檢查數據綁定在《Django表單系統初體驗》中我們使用類的方式創建了一個登陸表單,並在視圖函數中,通過是實例化類對象,成功的創建了一張用戶登錄表單。from django import formsclass LoginForm(forms.Form): username=forms.CharField(label="用戶名",min_length=6,max_length=12) password=forms.CharField(label="用戶密碼",min_length=
  • 深入理解Django的Form表單
    一、深入理解Django的Form表單1.1、話不多說,先看示例1.1.1、創建Form類from django.forms import Formfrom django.forms import widgetsfrom django.forms import fields class MyForm(Form
  • python測試開發django -142.Bootstrap 表單(form)
    收錄於話題 #django="Email"> </div> <div> <label for="Password1">密碼</label> <input type="password" id="Password1" placeholder="Password
  • Django表單系統工作原理詳述
    name, bases, attrs) if 'media' not in attrs: new_class.media = media_property(new_class) return new_classMediaDefiningClass 中並沒有做太多的工作,只是給類對象添加了 media 屬性,當我們使用
  • Django限制表單中ForeignKey對應下拉菜單選項數量的兩種經典方法
    我們希望某個用戶在使用表單創建或編輯某篇新文章時,表單上類別對應的下拉菜單選項不顯示所有類別,而只顯示用戶自己創建的類別,我們該如何實現?小編我今天就提供兩種經典方法供參考。forms.py應該如下所示。
  • Django 2.0 項目實戰: 擴展Django自帶User模型,實現用戶註冊與登錄
    因為這兩個視圖都需要用表單,所以我們先在users目錄下新建forms.py, 然後創建兩個form,一個RegistrationForm,一個LoginForm。代碼如下:from django import formsfrom django.contrib.auth.models import Userimport redef email_check(email):    pattern = re.compile(r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.
  • Django中英混合字符串的截取及表單中限制長度注意事項
    比如Django自帶過濾器truncatewords並不支持截取中文,另外模型中CharField中的max_length選項用於限制中英混合字符串的長度基本上是失真的,需要額外自定義表單驗證限制某些欄位比如標題的長度。小編我今天就給大家分享幾個例子和解決方案。我們同樣以博客的Article模型為例,我們試圖限制標題的最大長度為90 個字符。
  • 8個能提高Django開發效率的Python包
    但是在此之前,你可以先看看我們之前寫的有關如何讓Django 管理更加安全的技巧,以及一篇關於5個最喜歡的開源Django包的文章。 describe_form將顯示模型的表單定義,然後您可以將其複製/粘貼到forms.py中。(注意,這將生成一個普通的Django表單,而不是一個模型表單。) notes命令可以在整個項目中顯示所有帶有TODO、FIXME等內容的注釋。Django-extensions中還包含一些有用的抽象基類,可用於您自己的模型中。
  • python程式設計師嘔心瀝血整理 Django 優秀資源大全
    django-bootstrap3, star:1731 - 以 Django 的方式,在 Django 模板中使用 Bootstrap。django-crispy-forms, star:2756 - 實現 DRY Django 表單的最好方式。
  • 一篇文章帶你了解Django Form組件(入門篇)
    Form組件主要用於驗證表單數據。為什麼需要Form組件注:Form組件,只適用於,前後端未分離的項目中,主要用於驗證表單數據,所以,關鍵字是表單!!!比如像嗶哩嗶哩的註冊界面。,因為html form表單提交是刷新頁面提交的!霧草,沒了,這是少的,如果有十幾個???,那不就氣死了好像我記得我上學時,好多網站都是這。。。好像我也罵了很久,直到前後端分離時,才好一點!
  • Django Form基於Model定義表單
    初識表單系統ModelFormDjango 的表單系統充分考慮到這個問題,並給開發者提供了 ModelForm,使用它就可以實現基於 Model 的定義自動生成表單,這就大大簡化了根據 Model 生成表單的過程,很好解決了我們遇到的問題,下面就讓我們一起來看一下,它是如何實現這個過程的吧。
  • 使用 Django 進行測試驅動開發
    'length',]然後在 length 目錄下新建 urls.py,寫入以下內容:from django.urls import pathfrom length import viewsapp_name = 'length'urlpatterns = [ path('convert/', views.convert
  • Django實戰教程: 開發企業級應用智能文檔管理系統smartdoc(1)
    在閱讀本文前,請一定先閱讀Django核心基礎(3): View視圖詳解。一旦你使用通用視圖,你就會愛上她。這是因為我們視圖部分會直接使用Django的通用視圖。如果你對代碼有疑問,歡迎評論區留言。項目背景一個公司有很多產品,每個產品有各種各樣的文檔(圖片,測試報告,證書,宣傳單頁)。
  • django模型使用
    之前寫過一篇django的模型關係,今天騰出時間把上篇的兄弟篇補上,來學習下django orm, 利用django的模型可以很方便的對資料庫進行操作
  • 10道題教你使用python Django框架來實現web應用,值得收藏
    使用表單獲取同學們的旅遊意向。因為數據量小,所以可以直接將數據存入SQLite資料庫中。第二部分數據分析和結果展示,不一定需要依賴於django。根據需要從資料庫中提取信息進行分析。如果分析複雜,可以使用numpy、pandas進行分析,使用matploitlib展示分析結果。
  • 使用React和HTML5表單驗證API處理表單
    如果您不使用DevKit,則無法從其功能中受益。基於模式的建築形式或者,我們可以使用獨立的組件,根據提供的JSON規範為我們構建表單。讓我們把它放在一個表單中:import Formsy from "formsy-react";import React from "react";import MyInput from ".
  • 5個必讀常用的Django小技巧 by 搬運工大江狗
    作者生活在芬蘭,寫過很多關於Django技巧的原創英文文章。今天小編我就借花獻佛,用中文辛苦搬運來5個我認為非常有用的Django小技巧,與大家分享。Tip 5. 使用該組模板過濾器時,你需要在INSTALLED_APPS 加入django.contrib.humanize模塊,並在模板裡載入,如下所示。
  • 一篇文章淺析Django Form組件相關知識
    Form類from django.forms import Formclass LoginForm(Form): uname = fields.CharField(label="用戶名="----" to_field_name=None limit_choices_to=None from django.forms.models import ModelMultipleChoiceFieldModelMultipleChoiceField(ModelChoiceField)...
  • Django基礎(10): URL重定向的HttpResponseDirect, redirect和reverse的用法詳解
    在視圖views.py中利用HttpResponse重新定向至不含參數的URLfrom .models import Article, from django.http import HttpResponseRedirectfrom django.shortcuts import renderfrom .forms import ArticleForm