Django 之 form 組件


生成 html 代碼

  • views.py
    # 中需要導入模塊
    from django import forms, views
    
    # 然後新建一個類, 這個類要繼承 forms.Form
    class BookForm(forms.Form):
      
    	# 按照 models.py 中依次創建, 類似 models.CharField 改爲 forms.CharField
    	title = forms.CharField(
        max_length=16,
        # label 是 label 標籤的內容, 不填展示爲 "title"
        label="書名",
        # widget 爲插件
        widget=forms.TextInput(
          # 可以爲標籤添加屬性
          attrs={
            "class": "form-control",
            "placeholder": "此處填寫書名",
          }
        )
      )
    	    
    class BookAdd(views.View):
      
      def get(self):
        # 實例化
        form_obj = BookForm()
        # 此處 locals 表示環境內所有變量
        return render(request, "book_add.html", locals())
    
    
  • book_add.html
    <!-- novalidate 表示不檢查, autocomplate="off"表示不補全 -->
    <form action="" method="post" novalidate autocomplete="off">
    	{% csrf_token %}
    	<div class="col-md-8 col-md-offset-2">
    		<!-- 這個 form_obj 就是通過 locals() 傳過來的 -->
    		{% for foo in form_obj %}
    			<div class="form-group">
    				<label for="{{ foo.id_for_label }}">{{ foo.label }}</label>
    				{{ foo }}
          	<p style="color: red">{{ foo.errors.0 }}</p>
    			</div>
    		{% endfor %}
    		<input type="submit" value="提交" class="btn btn-success">
    	</div>
    </form>
    
    

校驗規則

參數校驗

class PersonForm(forms.Form):
	
  name = forms.CharField(
		max_length=16,
		label="姓名",
	)
  
  age = forms.IntegerField(
    # 該字段是否需要檢驗, false 爲不檢驗
  	required=False
  )
  
  phone = forms.CharField(
    # 最小長度和最大長度的檢驗
  	min_length=11,
    max_length=11,
  )

正則校驗

from django.core.validators import RegexValidator

class BookForm(forms.Form):
    phone = forms.CharField(
        validators=[RegexValidator(r'^1[356789]\d{9}$', "手機號碼格式有誤")]
    )


自定義校驗

from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError


# 自定義的校驗規則函數
def phone_validate(value):
    # 用用戶填寫的手機號去數據庫查找
    is_exist = models.Book.objects.filter(phone=value)
    if is_exist:
        # 如果已經存在, 就不能註冊
        raise ValidationError("該手機號已經註冊")
    else:
        return value
      

class BookForm(forms.Form):
    phone = forms.CharField(
        # validators 中可以插入多條驗證規則
        validators=[RegexValidator(r'^1[356789]\d{9}$', "手機號碼格式有誤"), phone_validate]
    )


Hook 校驗

class BookForm(forms.Form):
    title = forms.CharField(
        max_length=12,
        label="書名",
    )
    pwd1 = forms.CharField(
        label="pwd-1",
        widget=forms.PasswordInput(
            attrs={
                "class": "form-control"
            }
        )
    )
    pwd2 = forms.CharField(
        label="pwd-2",
        widget=forms.PasswordInput(
            attrs={
                "class": "form-control"
            }
        )
    )
    
  	# 局部鉤子: clean_字段 方法
    def clean_title(self):
        # 從處理後的數據中拿到 title 的值
        v = self.cleaned_data.get("title")
        if "alex" in v:
            raise ValidationError("包含敏感詞 alex")
        else:
            return v

    # 全局鉤子
    def clean(self):
        # 可以取到 cleaned_data 中所有的數據進行對比校驗
        pwd1 = self.cleaned_data.get("pwd1")
        pwd2 = self.cleaned_data.get("pwd2")
        if pwd1 != pwd2:
            # self.add_error("字段", "密碼和確認密碼不一致"), 這個是定義報錯信息的位置
            self.add_error("pwd2", "密碼不相同")
        else:
        		# 正常邏輯操作, 此處省略
            pass
          
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章