Belajar Django 3.1 Membuat Forms
Belajar Django 3.1 Membuat Forms

Form dalam bahasa Indonesia kita menyebutnya dengan formulir, form dalam website bisa berguna untuk mendapatkan informasi dari pengunjung. Untuk menerbitkan tulisan seperti yang kalian baca ini, juga menggunakan form.

Form atau formulir ada yang bersifat publik, maksudnya siapa saja bisa mengisi (menginput) data tertentu. Seperti pada form komentar di blog, form berlangganan (news letter), atau juga seperti google form. Adapun form yang private atau pribadi, artinya hanya pengguna yang mendapatkan izin yang dapat mengisi formulir tersebut. Misalnya form untuk menerbitkan tulisan diblog.

Membuat forms pada HTML menggunakan tag form, yang memiliki artibut action untuk menentukan kemana data akan dikirim, dan method adalah cara mengirimkan data tersebut.

Di dalam tag form, tentu memiliki field yaitu bidang yang akan diisi data.

Forms di Django

Untuk membuat form di Django, setidaknya 3 bagian yang terlibat. Django sudah menyediakan form class dan kita tinggal menggunakannya, tersedia banyak item data dari beberapa tipe yang mungkin diperlukan.

Di Django, kita tidak membuat form dari nol. Karena beberapa komponen seperti validasi, save, dan clean data sudah disediakan oleh Django. Form yang dibuat pun lebih aman dan sebagian besar pekerjaan sudah diotomatiskan.

Bagian yang ditangani oleh django meliputi persiapan dan rekonstruksi data agar dapat dirender, membuat dan menerima formulir HTML, juga menerima dan memproses data yang dikirim dari user. Kita juga dapat menulis form secara manual atau membiarkan Django mengurus semua itu.

Membuat Forms di Django

Seperti yang sudah dituliskan sebelumnya, Django memiliki Forms Class yang digunakan untuk membuat form. Membuat form class ini bisa saja ditulis pada file views.py, namun disini lebih baik kita buat satu file terpisah saja. Selain form class Django juga menyediakan ModelForm, Model formsets, modelfom_factory, dan inline formsets. Class-class itu akan digunakan untuk kebutuhan yang berbeda.

Misalkan dalam suatu kasus tertentu, kita akan membuat form untuk disimpan ke dua tabel berbeda, atau menyimpan data berdasarkan ID dari tabel lain dan disimpan ke tabel lainnya. Maka kita gunakan class yang sesuai untuk kebutuhan itu.

Form Class

Sebagai langkah awal membuat sebuah formulir, kita akan membuatnya di satu file yang bernama forms.py. File forms.py belum ada di app, maka kita langsung buat saja file tersebut. Selanjutnya

Agar lebih mudah dipahami, saya telah memiliki models.py seperti berikut ini

# file models.py

from django.db import models

# Create your models here.
class KontakModel(models.Model):
    nama_lengkap = models.CharField(max_length=100)
    tanggal_lahir = models.DateField()
    GENDER = [
        ('p', 'Pria'),
        ('w', 'Wanita'),
    ]
    jenis_kelamin = models.CharField(choices=GENDER, max_length=10)
    alamat = models.TextField()
    agree = models.BooleanField(default=False)

    def __str__(self):
        return self.nama_lengkap

Untuk lebih lengkap, bisa dibaca kembali tentang Django Models.

# file forms.py

from django import forms

class KontakForm(forms.Form):
    nama_lengkap = forms.CharField()
    tanggal_lahir = forms.DateField()
    GENDER = [
        ('p', 'Pria'),
        ('w', 'Wanita'),
    ]
    jenis_kelamin = forms.ChoiceField(choices=GENDER)
    alamat = forms.CharField(widget=forms.Textarea)
    agree = forms.BooleanField()

Ok, kita sudah punya satu form yang bernama KontakForm. Pada form ini, belum ditampilkan dihalaman yang kita inginkan. Maka, agar bisa ditampilkan pada halaman web, kita harus memanggilnya dari file views.py.

Sebelum itu, kita lihat dulu apa yang ada didalam KontakForm ini.

  1. Baris pertama, kita memanggil class forms dari django
  2. Dilanjutkan dengan membuat class bernama KontakForm dengan kita membuat turunan dari class forms.Form.
  3. Pada block KontakForm berisi field nama_lengkap ini berupa CharField, CharField ini adalah input text. tanggal_lahir dengan field type-nya DateField yaitu input date, jenis_kelamin disini kita membuat pilihan Pria dan Wanita yang diambil dari GENDER

    Ada alamat menggunakan widget text area.

    Yang terakhir ada agree berupa input select

views.py

Sekarang kita akan menampilkannya pada halaman web, untuk itu pada file views.py kita akan memanggilnya.

Baca Juga :

  1. Function Based Views
  2. Class Based Views
# file views.py

from django.shortcuts import render, redirect
from .models import KontakModel
from .forms import KontakForm

def KontakView(request):
    contact_form = KontakForm(request.POST or None)
    if request.method == 'POST':
        if contact_form.is_valid:
            simpan_data = KontakModel.objects.create(
                nama_lengkap = contact_form.cleaned_data.get('nama_lengkap'),
                tanggal_lahir = contact_form.cleaned_data.get('tanggal_lahir'),
                jenis_kelamin = contact_form.cleaned_data.get('jenis_kelamin'),
                alamat = contact_form.cleaned_data.get('alamat'),
                agree = contact_form.cleaned_data.get('agree')
            )
            return redirect('Contact:kontakList')
    context = {
        'form_saya': contact_form
    }
    return render(request, 'contact_form.html', context)
  1. Baris pertama from django.shortcuts import render
  2. Pada baris ke 3 mengimport class KontakForm dari file forms.py
  3. Baris ke 4 mengimport class Kontak dari models.py
  4. Selanjutnya membuat function bernama KontakView
  5. Pada contact_form = KontakForm(request.POST or None), kita akan mengembalikan salah satu objek dari KontakForm. Ketika request.POST nilainya kosong, maka formulir diinisialisasi tanpa argumen dengan tidak ada.
  6. Baris if request.method == 'POST':, saat request.POST tidak kosong maka formulir diinisialisasi dengan QueryDict.
  7. Baris if contact_form.is_valid():, memeriksa apakah form dinyatakan valid. Ketika form valid, simpan_data akan dijalankan.
  8. Baris simpan_data = Kontak.objects.create(...) menentukan data akan disimpan ke tabel. Dalam contoh ini, data akan disimpan ke models pada class Kontak. Berikut menentukan field dari form dan field pada models yang sesuai.
  9. Baris return redirect('Contact:kontakList') setelah berhasil menyimpan data, halaman akan dialihkan ke halaman /list, lihat pada file urls.py. Contact adalah app_name dan kontakList adalah nama url path.
  10. Baris selanjutnya context, pada contoh ini saya membuat context dengan 'form_saya ': contact_form yang nanti akan dirender pada file contact_form.html
  11. Dan terakhir return render(request, 'contact_form.html', context) mengembalikan hasilnya berupa response ke halaman web

urls.py

# file urls.py

from django.urls import path
from . import views

app_name = 'Contact'

urlpatterns = [
    .....
    path('list', views.KontakView, name='kontakList'),
    .....
]

Selanjutnya, membuat template pada file contact_form.html

Ada cara yang praktis untuk memasukkan form ke dalam tempate. Django akan merender semua elemen label dan input pada form yang dicontoh ini dengan context {{ form_saya }}. Yaitu dengan {{ form_saya.as_table }}, {{ form_saya.as_p }}, dan {{ form_saya.as_ul }}

Contoh merender form_saya dengan as_table

<body>
    <form method="post">
        {% csrf_token %}
        <table>
            {{ form.as_table }}
            <tr><td></td><td><input type="button" value="Simpan"></td></tr>
        </table>        
    </form>
</body>

Outputnya akan seperti ini

<form method="post">
        <input type="hidden" name="csrfmiddlewaretoken" value="8QoZgGtQv9UeOm9BFcZ6PXxQIN4zxnN9HdlIS5qqFvGFoGmlTwOS0YersfjvRHxe">
        <table>
            <tr><th><label for="id_nama_lengkap">Nama lengkap:</label></th><td><input type="text" name="nama_lengkap" maxlength="100" required id="id_nama_lengkap"></td></tr>
<tr><th><label for="id_tanggal_lahir">Tanggal lahir:</label></th><td><input type="text" name="tanggal_lahir" required id="id_tanggal_lahir"></td></tr>
<tr><th><label for="id_jenis_kelamin">Jenis kelamin:</label></th><td><select name="jenis_kelamin" required id="id_jenis_kelamin">
  <option value="" selected>---------</option>

  <option value="p">Pria</option>

  <option value="w">Wanita</option>

</select></td></tr>
<tr><th><label for="id_alamat">Alamat:</label></th><td><textarea name="alamat" cols="40" rows="10" required id="id_alamat">
</textarea></td></tr>
<tr><th><label for="id_agree">Agree:</label></th><td><input type="checkbox" name="agree" id="id_agree"></td></tr>
            <tr><td></td><td><input type="button" value="Simpan"></td></tr>
        </table>        
    </form>

Bisa juga dengan merender setiap field secara manual

<body>
    <form method="post">
        {% csrf_token %}
        {% for field in form %}
        <label for="{{ field.auto_id }}">
            {{ field.label }}
            {% for error in field.errors %}
            {{ error }}
            {% endfor %}
        </label>

        <div>
            {{ field }}
        </div>
        {% endfor %}
        <div>
            <input type="button" value="Simpan">
        </div>
    </form>
</body>

Model Form

ModelForm penggunaannya sangat mudah dan lebih cepat, dengan sedikit kode dibandingkan dengan form class. Pada ModelForm ini, kita tidak membuat satu persatu fieldnya. ModelForm akan membuat field berdasarkan dari models yang digunakan. Dan kita juga tetap punya pilihan untuk mengisi semua field atau field tertentu saja.

# file forms.py

from django.forms import ModelForm
from .models import KontakModel

class KontakFormModel(ModelForm):
    class Meta:
        model = KontakModel
        fields = '__all__'

Seperti contoh di atas, saya masih tetap menggunakan models yang sama dari contoh sebelumnya yang form class. Dan dengan Model Form, seharusnya sudah sangat jelas banget. pada baris model = KontakModel tentu saja ini model-nya, dari models.py dan pada fields = '__all__', maksudnya kita akan mengambil semua field yang ada pada models.

Untuk memilih field tertentu saja, gunakan fields = ['nama_lengkap', 'alamat']. Artinya kita hanya mengambil field nama_lengkap dan alamat dari model KontakModel. Disesuaikan namanya dengan models yang dibuat.

Pada views.py juga menjadi lebih ringkas dengan menggunakan Class Based Views

# file views.py

from django.views.generic import CreateView
from .models import KontakModel
from .forms import KontakFormModel

class KontakViewsClass(CreateView):
    form_class = KontakFormModel
    template_name = 'contact_form.html'

Untuk templatenya, masih bisa menggunakan kode yang sebelumnya. Hanya ada perubahan sedikit pada {{ form_saya.as_table }} menjadi {{ form.as_table }}. Atau untuk yang rendering secara manual yang sebelumnya {% for field in form_saya %} menjadi {% for field in form %}. Karena disini context-nya berbeda.

Akhir Kata

Setelah kita mengetahui, dua cara membuat form di Django. Menurut saya, akan lebih mudah menggunakan ModelForm karena dengan sedikit kode tetap bisa membuat form yang sesuai. Dibandingkan dengan menggunakan class form.

Tapi itu kembali lagi kepada teman-teman semua ingin menggunakan yang mana.

Masih ada pembahasan lain terkait dengan cara membuat form di Django. Yaitu Model formsets, modelfom_factory, dan inline formsets. Saya akan memberikan contoh penggunaannya pada halaman yang lain.

Formulir Anda tidak dapat disimpan. Silakan coba lagi.
Anda berhasil berlangganan

Newsletter

Jadi yang pertama mendapatkan pembaruan artikel Python dan Django