Pengesahan data borang Django ialah pautan utama dalam pembangunan web, memastikan data pengguna yang dikumpul memenuhi keperluan aplikasi. Django menyediakan pelbagai kaedah pengesahan medan, yang artikel ini akan menerangkan langkah demi langkah.
Apabila mentakrifkan medan borang Django, anda biasanya boleh menentukan peraturan pengesahan secara langsung melalui parameter medan.
Sebagai contoh, pastikan medan first_name
mempunyai panjang maksimum 100 aksara. Oleh kerana ia adalah CharField
, anda boleh menggunakan parameter max_length
:
<code class="language-python">from django import forms class PersonalInfo(forms.Form): first_name = forms.CharField(max_length=100)</code>
Ini adalah salah satu kaedah pengesahan yang paling mudah dan paling biasa digunakan.
Pengesah terbina dalam Django ialah objek boleh panggil boleh guna semula yang melakukan semakan pengesahan khusus.
Andaikan anda ingin memastikan bahawa nilai minimum medan age
ialah 18. Walaupun adalah mungkin untuk menggunakan parameter min_value
secara langsung, berikut ialah demonstrasi cara menggunakan MinValueValidator
Django:
<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>
Modul validators
Django menyediakan berbilang pengesah pra-bina untuk tugas seperti semakan nilai min/maks, pengesahan ungkapan biasa dan banyak lagi.
Kadangkala, logik pengesahan yang lebih kompleks diperlukan yang tidak dapat dikendalikan oleh pengesah terbina dalam. Dalam kes ini, adalah mungkin untuk menulis pengesah tersuai.
Pengesah ialah objek boleh panggil yang menerima nilai dan menaikkan ValidationError
jika nilai tidak memenuhi kriteria. Contohnya, cipta pengesah untuk memastikan nombor adalah genap:
<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>
Petua: Untuk memastikan kod anda teratur, pertimbangkan untuk meletakkan pengesah tersuai anda dalam fail berasingan, seperti validators.py
. Ia bergantung kepada saiz projek.
clean_<fieldname>()
Satu lagi kaedah pengesahan medan yang berkuasa adalah untuk mengatasi kaedah clean_<fieldname>()
dalam kelas borang. Kaedah ini amat berguna untuk logik pengesahan yang khusus untuk satu bentuk.
Sebagai contoh, untuk mengesahkan medan even_field
terus dalam borang:
<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>
Kaedah ini menyediakan akses terus kepada data bersih medan dan membenarkan kawalan yang lebih halus ke atas pengesahan.
clean()
KaedahKadangkala pengesahan perlu mengambil kira perhubungan antara berbilang medan dalam borang. Sebagai contoh, katakan anda mempunyai dua medan dan anda perlu memastikan bahawa satu medan mempunyai lebih banyak aksara daripada yang lain. Pengesahan jenis ini ialah pengesahan peringkat borang kerana ia bergantung pada nilai berbilang medan, bukan hanya satu medan.
Untuk melakukan ini, anda boleh mengatasi kaedah clean()
dalam kelas borang.
<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>
Dengan mengatasi kaedah clean()
, anda boleh melaksanakan logik pengesahan tersuai yang digunakan pada keseluruhan borang untuk memastikan data memenuhi keperluan yang lebih kompleks.
Django menyediakan pelbagai kaedah pengesahan borang:
max_length
atau min_value
dan parameter lain untuk pengesahan mudah. clean_<fieldname>()
clean()
Atas ialah kandungan terperinci Teknik untuk pengesahan medan di Django. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!