Django Form – Validation

Django memiliki built-in validator untuk form. Pada modul ini kita akan membahas beberapa validasi dasar dengan skenario bot checking dan field nama harus diawali dengan huruf s. Selain itu kita juga akan membahas clean method untuk scope form.

Masih melanjutkan project dari modul sebelumnya, buka file myapp/forms.py

Memeriksa bot menggunakan method clean_

Pendekatan yang dilakukan adalah, hidden field tidak nampak, user normal tidak akan mungkin melakukan pengisian. sementara bot, dimana menggunakan program, akan mencoba mengisi hidden field. Tentu hal ini menjadi tidak berfungsi jika bot yang dibuat cukup pintar dan tidak mengisi hidden field.

Pada forms.py, tambahkan code berikut:

from django import forms

class FormName(forms.Form):
    name = forms.CharField()
    email = forms.EmailField()
    text = forms.CharField(widget=forms.Textarea)
    botcatcher = forms.CharField(required=False, widget=forms.HiddenInput)

    def clean_botcatcher(self):
        botcatcher = self.cleaned_data['botcatcher']
        if len(botcatcher) > 0:
            raise forms.ValidationError("Bot")
        return botcatcher

Fungsi yang digunakan harus diawali dengan keyword clean_nama_field, dalam hal ini adalah clean_botcatcher , fungsi ini akan memeriksa panjang dari field botcatcher, jika lebih besar dari 0, maka dilakukan raise error.

Note: jika Anda ingin melakukan clean untuk seluruh form, nama fungsi clean, tanpa _nama_field.

Jalankan server. Untuk simulasi bot, buka developer tools, cari input type hidden botcatcher, lalu tambahkan attribute value dan isi dengan sembarang teks.

Tutup developer tools, lalu lakukan submit.

Dapat dilihat, pada gambar diatas pada html page akan tampil error hidden field botcatcher, hasil validasi pada code diatas. Dan karena terjadi error, maka perintah menampilkan data yang disubmit pada console juga tidak akan dijalankan.

Memeriksa bot menggunakan Django Built-in validator

Masih dengan file forms.py, dan skenario memeriksa bot, kali ini kita tidak akan membuat fungsi sendiri, namun menggunakan Django built-in validator.

Library validator harus dimport dari django.core.

Untuk skenario memeriksa bot, kita gunakan validator MaxLengthValidator(0), artinya isi field tidak boleh lebih besar dari 0, alias harus kosong.

Ubah code menjadi seperti berikut:

from django import forms
from django.core import validators

class FormName(forms.Form):
    name = forms.CharField()
    email = forms.EmailField()
    text = forms.CharField(widget=forms.Textarea)
    botcatcher = forms.CharField(required=False, widget=forms.HiddenInput, 
                                validators=[validators.MaxLengthValidator(0)])

Lakukan lagi test diatas, dapat dilihat kali ini pada halaman html akan ditampilkan message yang berbeda:

(Hidden field botcatcher) Ensure this value has at most 0 characters (it has 4).

Dapat kita lihat, dengan menggunakan built validator, code lebih pendek dan mudah penggunaanya.

Membuat Custom Validator

Kita juga bisa membuat custom validation, misalnya untuk contoh, kita ingin memastikan nama harus diawali huruf s.

Perhatian: untuk custom validator, nama fungsi bebas, namun parameter harus menggunakan keyword value.

Ubah code menjadi seperti berikut:

from django import forms
from django.core import validators

def check_for_s(value):
    if value[0].lower() != 's':
        raise forms.ValidationError('Nama harus diawali s')

class FormName(forms.Form):
    name = forms.CharField(validators=[check_for_s])
    email = forms.EmailField()
    text = forms.CharField(widget=forms.Textarea)

Jika field nama diisi dengan value yang tidak diawali huruf s, error akan terjadi dan ditampilkan dalam halaman html.

Form Scope clean Method

JIka pada contoh diatas, clean method untuk field botcatcher saja, pada contoh berikut, fungsi clean untuk seluruh componen dalam form. Perhatikan nama fungsi hanya menggunakan keyword clean saja.

Skenarionya adalah memeriksa apakah email sesuai dengan verifikasi email.

Ubah forms.py seperti dibawah

from django import forms
from django.core import validators

class FormName(forms.Form):
    name = forms.CharField()
    email = forms.EmailField()
    ver_email = forms.EmailField()
    text = forms.CharField(widget=forms.Textarea)

    def clean(self):
        all_clean_data = super().clean()
        e1 = all_clean_data['email']
        e2 = all_clean_data['ver_email']

        if e1 != e2:
            raise forms.ValidationError('Email tidak sama..')

Sesuai ekspektasi, jika verify email diisi berbeda maka error akan ditampilkan.

Sampai disini kita sudah mempelajari dasar-dasar form validasi, untuk informasi lebih lengkap mengenai django validator, silakan kunjungi https://docs.djangoproject.com/en/4.0/ref/validators/

Sharing is caring:

Leave a Comment