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",)

select form

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

widgets

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

Show Comments