天天看點

Django中的Form表單類

  • Django的Form類

    Django表單系統的核心元件是Form類.它與Django模型描述對象的邏輯結構、行為以及它呈現給我們内容的形式的方式大緻相同, Form 類描述一張表單并決定它如何工作及呈現。

    類似于模型類的字段映射到資料庫字段的方式,表單類的字段會映射到HTML表單的 元素。

    ModelForm 通過 Form 映射模型類的字段到HTML表單的 元素,Django admin就基于此。

  • 執行個體化、處理和渲染表單

    當我們處理表單時,我們一般在視圖中執行個體化它。

    當我們執行個體化表單時,我們可以選擇讓它為空或者對它預先填充(依據請求是post還是get)

  1. 來自已儲存的模型執行個體的資料(例如在管理編輯表單的情況下)
  2. 我們從其他來源擷取的資料
  3. 從前面一個HTML 表單送出過來的資料
  • 實操
  1. 建構一個表單
在對應的app下建立form.py檔案
from django import forms
class RegisterForm(forms.Form): # 自定義表單類,并繼承forms.Form
  email = forms.EmailField(required=true,widget=forms.EmailInput( 
      attrs={"class": "form-control"}))
#forms.類型() 定義對應字段的表單類型
  username = forms.CharField(min_length=4, max_length=12, widget=forms.TextInput(
      attrs={"class": "form-control"}))
      
  password = forms.CharField(min_length=6, widget=forms.PasswordInput(
      attrs={"class": "form-control"}))

  password2 = forms.CharField(min_length=6, widget=forms.PasswordInput(
      attrs={"class": "form-control"}))

  valid_code = forms.CharField(widget=forms.TextInput(
      attrs={"class": "form-control"}))
      
required是否可以為空,true表示不可以為空
min_length=4, max_length=12定義字段字元長度
widget參數用來指定字段的類型和屬性widget=forms.XXinput() == input标簽中type=text||password等的類型
(widget=forms.XXX(attrs={"class": "form-control", 'placeholder': '預設顯示'}))
常用的一些參數
           
  1. clean驗證函數 不用在view視圖驗證可直接在form類中實作
form類的運作順序是init,clean,validte,save
其中clean和validate會在form.is_valid()方法中被先後調用 是以不用在視圖函數中調用form會自動調用
局部鈎子clean_field用于驗證單個字段,全局鈎子clean用于驗證兩個字段
必須在構造的form類中,且必須有傳回值
cleaned_data['xxx']#擷取表單傳回的值,
如:
#對具體form表單字段進行驗證,驗證成功則view視圖調用時會擷取到對應的值
 def clean_XXX(self):(def clean_XX-必須是上方定義的字段)
        xxxx = self.cleaned_data['XXX']#擷取form表單中XXX的值
        if xxxx DO SOMTRHIN:#進行驗證
            raise forms.ValidationError('郵箱已存在')#傳回異常
        return email#傳回值
        
#驗證兩個字段,如驗證使用者名和對應密碼是否是user
def clean():
  pass
           
  1. 構造執行個體對象,傳入模闆渲染
#判斷request請求是否是post
form_obj = RegisterForm(request.POST)#執行個體化表單
#驗證送出的表單:
if form_obj.is_valid():  # 根據字段屬性和驗證函數進行校驗
 #通過驗證傳回 True 将表單的資料放到它的屬性 cleaned_data 中。
 #對資料進行進一步驗證
  username=reg_form.clean_username()
            email=reg_form.clean_email()
#如果隻是普通的渲染get請求:
form_obj = RegisterForm()
context = {}
context['reg_form'] =form_obj
return render(request, 'register.html', context)
 
           
  1. 模闆顯示
{# 不設定action跳轉的動作,由背景完成,跳轉 否則達不到預期效果#}
    <form action="#" method="post">
   {% csrf_token %}
    {% for field in reg_form %}
    {# 周遊所有form表單屬性#}
    <label for="{{ field.id_for_label }}">
    {# 擷取每一個form表單屬性定義的字段#}
    {{ field.label }}
     </label>
    {#擷取對應form表單屬性的input欄#}
     {{ field }}
    <p class="text-danger">
    {#  對應每一個form表單屬性,背景驗證不通過報錯提示标簽#}
    {{ field.errors.as_text }}
    </p>
     {% endfor %}
    <span class="pull-left text-danger">
    {#設定表單送出時的檢驗報錯提醒#}
    {{ reg_form.non_field_errors }}
    </span>
    <input type="submit" value="登入" class="btn btn-primary pull-right">
</form>