Catatan Belajar Django Part 2: Model Form di Django Admin
Sebelum menuju kepada django form mari membahas terkait html form, menurut web dev mozilla
The HTML element represents a document section containing interactive controls for submitting information.
Intinya, from di html bertanggung jawab atau bertugas dalam handle inputan dengan interaksi user, contoh sederhana kolom komentar di bawah, di bagian komentar terdapat beberapa inputan
1. komentar
2. nama
3. email
4. web
Tiap kolom tersebut mewakili yang dinamakan input type, contoh di bawah
komentar -> text area
nama -> input type text
email -> input type email
url -> input type url
Sebenarnya masih banyak tipe input lainnya, silahkan buka kembali web terkait html form
Satu hal terkait form yang harus diperhatikan adalah, semua elemen yang tadi disebut harus berada di dalam tag form, contohnya
<form> ...list of field </form>
Method & Action
Paling dasar ada dua hal yang diperhatikan yaitu Method dan Action
Method: Sesuai namanya metoda yang digunakan saat interaksi dengan formnya, umumnya POST & GET
Action: Intinya adalah tujuan dimana data akan diolah
Method POST: Method ini biasa digunakan untuk kebtuhan “create” atau ada interaksi perubahan/penambahan data, saat kita melakukan method post kita gak akan melihat datanya secara langsung karena dikirim “lewat belakang”
<form method="POST" action="some-location"> .. list field </form>
Contohnya adalah form komentar di bawah atau form login, kita kan “gak tahu” datanya dikirim ke mana yang kita tahu kalau sukses login akan dicatat login kalau gagal muncul warning/error
Method GET: Method ini biasanya untuk kebuthan “read only”, biasa digunakan di list table atau filter, dan isi datanya akan berupa “query string”
<form method="GET" action="some-location"> ...list field </form>
Contoh paling gampang adalah fitur pencarian di samping, coba ketikan misal “django” maka akan diarahkan ke halaman pencarian dan urlnya berubah menjadi
https://blog.arsmp.com/?s=django
Submit
Form baik Post dan Get bisa dipicu oleh button atau type submit.
Tulisan di bawah akan berfokus kepada admin form dan spesifiknya untuk kebutuhan django admin, kedepannya akan ada lagi tulisan tentang form ketika sudah mencapai topik tulisan views
Dalam tulisan sebelumnya kita bisa memanipulasi tampilan form dengan atribut seperti fields, fieldset, readonly, dan exclude. Di tulisan ini masih mirip-mirip tapi alih-alih dibuat spesifik di admin, kita buat ini di level “form”
Pertama buat dulu berkas forms.py di folder app dan isi dari berkas tersebut
from django import forms from blog.models import Content class ContentForm(forms.ModelForm): class Meta: model = Content fields = "__all__"
Kode di atas saya mempunya satu Class dengan nama ContenForm yang inherits dari modelform, dalam model form yang harus diperhatikan adalah
Meta model: Untuk identifikasi model mana yang di-lookup oleh form
Meta Fields: Untuk informasikan fields apa saja yang dimunculkan, di contoh di atas saya menggunkana nilai `__all__` yang artinya semua fields, jika ingin memunculkan beberapa fields bisa menggunakan list atau tupple dari nama fields
fields = ("title", "slug", "body")
atau lebih gampangnya lagi dengan exclude, formatnya sama menggunakan list atau tupple dari field, bedanya exclude berarti menghilangkan field yang ditulis di dalam list atau tuple
exclude = ("slug",)
Overide Field
Pada contoh tulisan sebelumnya ada field “publish” yang berupa checkbox, di mana checkbox adalah “implementasi” boolean field pada form, lalu kita ingin ubah dari checkbox ke berupa option field atau select box, kita bisa overide seperti ini
class ContentForm(forms.ModelForm): OPTIONS = ((False, "Draft"), (True, "Publish")) publish = forms.ChoiceField(choices=OPTIONS) class Meta: model = Content exclude = ("slug",)
Perkara overide ini bukan sekadar ganti tipe field bisa juga di level validasi, misal di model udah dideklarasikan bahwa max length nya cuma 50
name = models.CharField(max_length=50)
Kita bisa ubah lagi jadi max cuma 30 misalnya
class ContentForm(forms.ModelForm): OPTIONS = ((False, "Draft"), (True, "Publish")) title = forms.CharField(max_length=30) publish = forms.ChoiceField(choices=OPTIONS) class Meta: model = Content exclude = ("slug",)
Saat kita akses lagi formnya tidak ada tampilan yang berbeda cuma kita jadi gak bisa input lebih dari 30 karakter walaupun dari model maksimumnya 50
Widgets
Dikutip langsung dari situs django
A widget is Django’s representation of an HTML input element.
Sederhanya widget ini menentukan jenis field yang akan dimunculkan, contoh di atas “title” merupakan “Charfield” tanpa widget, maka pada tampilan depan itu sama dengan “input type=text” tapi untuk suatu alasan mungkin dari text biasa ingin diubah menjadi “textarea” maka kita bisa menambahkan widgets textarea ke dalam charfield
Sebenarnya masih ada tulisan cakupan forms seperti validasi misalnya, tapi rasanya akanlebih baik ditulis terpisah sebgai konteks validasi.
Kalau gitu sampai jumpa di tulisan berikutnya
referensi:
https://docs.djangoproject.com/en/3.2/ref/forms/widgets/
https://docs.djangoproject.com/en/3.2/ref/forms/fields/#built-in-fields