Python Web開發系列課程之——Django中Form的妙用

【前置課程】蘊含在Django中的MTV模式

任何一個系統對于網絡數據的提交都希望達到一定的“正確性”。無論是確保數據本身的真實性還是引導用戶輸入系統允許的數據,數據驗證,是一個不得不關注的問題。

比如最早期的STRUTS、STRUTS 2,直至今日的 Spring MVC 等 WEB 框架中對于服務器端數據驗證都提供了相應的解決方案。

處理數據驗證本身就是一個復雜的業務。Django 提供的 Form 功能簡單易用,而且 Django 認為自帶的 Form 處理會比大多數程序員自己編寫代碼處理要來得更安全。

示例代碼

def myform(request):
    if request.method == 'GET':
        return render(request, "form.html")
    elif request.method == 'POST':
        js_id = request.POST['js_id'] #簡書ID
        age = request.POST['age'] #年齡

        user = UserInfo()
        user.js_id = js_id
        user.age = age
        user.save() #保存數據
        return render(request, "form.html", {'success': 'success'})

提問:上面的代碼存在哪些不足?【age】信息是必填的嗎?如果填寫了是一個負數這樣的數據還有效嗎?【js_id】的真實長度超過了100怎么辦?

【5分鐘】普通Form類的使用

forms.py的代碼:

# _*_ coding: utf-8 _*_

from django import forms

class UserInfoForm(forms.Form):
    js_id = forms.CharField(label="簡書id",error_messages={'required': '請輸入簡書ID'})
    age = forms.IntegerField(label="年齡")
    
    # 省略其他要驗證的字段內容
    
    def clean_age(self):    
      age = self.cleaned_data['age']
      if age < 0:
          raise forms.ValidationError("年齡范圍填寫錯誤")
      return age

views.py的代碼:

def myform(request):
    if request.method == 'GET':
        return render(request, "form.html")
    elif request.method == 'POST':
        userInfoForm = UserInfoForm(request.POST)
        if userInfoForm.is_valid():
            pass #寫保存數據的代碼
           return render(request, "form.html", {'success': 'success'})
        else:
            return render(request, "form.html", {
                'errors': userInfoForm.errors
            })

講解:
定義Form類和Form字段(和model中的字段有什么關系嗎?)
Form類的常用屬性和方法,is_valid()函數,errors屬性

【5分鐘】ModelForm的使用

如果你要創建由數據庫驅動的app,那么你使用的Form將很接近你創建的Model。
比如我們的【UserInfo】Model,里面所有字段和我們的Form是一樣的,那么我們就可以直接使用Model的定義來驗證Form里的字段。

從官方文檔我們可以發現,每一個Form字段類型與之對應一個Model的字段類型。當然,除了【AutoField】等特定的Model字段類型對于Form來說是不需要的。

Model & Form 字段對比

forms.py的代碼:

from django import forms
from message.models import UserInfo

class UserInfoForm(forms.ModelForm):
    class Meta:
        model = UserInfo
        fields = "__all__"
        exclude = ['create_time']

views.py的代碼:

…… 省略 ……

if request.method == 'POST':
    user_info_form = UserInfoForm(request.POST)
    if user_info_form.is_valid():
        userInfo = user_info_form.save(commit=True)
        return render(request, "success.html", {})
        
…… 省略 ……

講解:
class Meta 的定義方式以及 ModelForm 和 Model 的關系。
常用 Meta 屬性的配置方法

【5分鐘】模版中表單的渲染(view、form、html代碼僅供參考)

html的代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>根據Form生成表單</title>
</head>
<body>
{{ form.as_p }}
</body>
</html>

forms.py的代碼:

# _*_ coding: utf-8 _*_

from django import forms

class UserInfoForm(forms.Form):
    js_id = forms.CharField(label="簡書id")
    age = forms.IntegerField(label="年齡")

views.py的代碼:

def newform(request):
    form = UserInfoForm()
    return render(request, 'index.html', {'form': form})

運行效果:

模版渲染表單

從瀏覽器查看頁面源碼:

瀏覽器源碼查看

HTML中的Form也是可以生成的!~

幾個重點函數掌握:
.is_valid():返回True或者False,用于驗證綁定了數據的Form是否通過的驗證。
.cleaned_data:通過驗證后的數據,f.cleaned_data['age']來取具體通過驗證的某個值。
.errors:error封裝所有的錯誤信息,如果沒有獲取到,默認為None。
_clean():field_clean()函數編寫定制化驗證的函數。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容