Django表單資料驗證是Web開發的關鍵環節,確保收集到的使用者資料符合應用需求。 Django提供多種欄位驗證方法,本文將逐步解說。
定義Django表單欄位時,通常可直接透過欄位參數指定驗證規則。
例如,確保first_name
欄位最大長度為100個字元。由於它是CharField
,可以使用max_length
參數:
<code class="language-python">from django import forms class PersonalInfo(forms.Form): first_name = forms.CharField(max_length=100)</code>
這是最簡單、最常用的驗證方法之一。
Django的內建驗證器是可重複使用的可呼叫對象,執行特定的驗證檢查。
假設要確保age
欄位最小值為18。雖然可以直接使用min_value
參數,但此處示範如何使用Django的MinValueValidator
:
<code class="language-python">from django import forms from django.core.validators import MinValueValidator class PersonalInfo(forms.Form): first_name = forms.CharField(max_length=100) age = forms.IntegerField(validators=[MinValueValidator(18)])</code>
Django的validators
模組提供多個預先建置的驗證器,用於最小/最大檢查、正規表示式驗證等任務。
有時,需要更複雜的驗證邏輯,內建驗證器無法處理。在這種情況下,可以編寫自訂驗證器。
驗證器是可呼叫對象,它接收一個值,如果值不符合條件,則引發ValidationError
。例如,建立一個驗證器來確保數字為偶數:
<code class="language-python">from django import forms from django.core.exceptions import ValidationError from django.core.validators import MinValueValidator def validate_even(value): if value % 2 != 0: raise ValidationError(f"{value} 不是偶数") class PersonalInfo(forms.Form): first_name = forms.CharField(max_length=100) age = forms.IntegerField(validators=[MinValueValidator(18)]) even_field = forms.IntegerField(validators=[validate_even])</code>
提示: 為保持程式碼井然有序,可考慮將自訂驗證器放在單獨的檔案中,例如validators.py
。這取決於項目的規模。
clean_<fieldname>()
方法另一個強大的欄位驗證方法是重寫表單類別中的clean_<fieldname>()
方法。此方法特別適用於特定於單一表單的驗證邏輯。
例如,直接在表單中驗證even_field
欄位:
<code class="language-python">from django import forms from django.core.exceptions import ValidationError from django.core.validators import MinValueValidator class PersonalInfo(forms.Form): first_name = forms.CharField(max_length=100) age = forms.IntegerField(validators=[MinValueValidator(18)]) even_field = forms.IntegerField() def clean_even_field(self): even_field_validated = self.cleaned_data.get("even_field") if even_field_validated % 2 != 0: raise ValidationError(f"{even_field_validated} 不是偶数") return even_field_validated</code>
此方法可以直接存取欄位的已清理數據,並允許更精細地控制驗證。
clean()
方法有時,驗證需要考慮表單中多個欄位之間的關係。例如,假設有兩個字段,需要確保一個字段的字元數多於另一個字段。這種類型的驗證是表單層級驗證,因為它取決於多個欄位的值,而不僅僅是單一欄位。
為此,可以重寫表單類別中的clean()
方法。
<code class="language-python">from django import forms from django.core.exceptions import ValidationError from django.core.validators import MinValueValidator class PersonalInfo(forms.Form): first_name = forms.CharField(max_length=100) age = forms.IntegerField(validators=[MinValueValidator(18)]) even_field = forms.IntegerField() field1 = forms.CharField() field2 = forms.CharField() def clean_even_field(self): even_field_validated = self.cleaned_data.get("even_field") if even_field_validated % 2 != 0: raise ValidationError(f"{even_field_validated} 不是偶数") return even_field_validated def clean(self): # 表单级验证 cleaned_data = super().clean() field1_value = cleaned_data.get("field1") field2_value = cleaned_data.get("field2") if field1_value and field2_value and len(field1_value) >= len(field2_value): raise ValidationError("field2 字符数必须多于 field1.") return cleaned_data</code>
透過重寫clean()
方法,可以實現應用於整個表單的自訂驗證邏輯,確保資料符合更複雜的要求。
Django提供多種表單驗證方法:
max_length
或min_value
等參數進行簡單驗證。 clean_<fieldname>()
方法:重寫此方法進行高級的特定字段驗證。 clean()
方法:使用此方法進行涉及多個字段的表單級驗證。 以上是Django 中的字段驗證技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!